Ruby on rails 使用俄罗斯玩偶手动终止缓存

Ruby on rails 使用俄罗斯玩偶手动终止缓存,ruby-on-rails,ruby-on-rails-4,russian-doll-caching,Ruby On Rails,Ruby On Rails 4,Russian Doll Caching,我有一个用户,可以有很多保存的搜索和很多任务。我使用以下方法缓存它们 - cache user do - user.tasks.each do |task| - cache task do # do something with task - cache user do - user.saved_searches.each do |search| - cache search do # do something with search 我添加了

我有一个用户,可以有很多保存的搜索和很多任务。我使用以下方法缓存它们

- cache user do
  - user.tasks.each do |task|
    - cache task do
      # do something with task

- cache user do
  - user.saved_searches.each do |search|
    - cache search do
      # do something with search
我添加了通过触摸选项更新用户的选项,无论何时更新这些记录。我想澄清的问题是这种情况:

我已经更新了一个搜索,它使该搜索的缓存过期,实际上是用户的缓存过期。由于用户的缓存已过期,将执行user.tasks

有没有办法防止这种情况


我正在考虑向缓存用户添加一个密钥,并手动使缓存过期,这是我在使用缓存摘要gem之前一直在做的,但我不知道如何做。

您可以使用最新更新的集合缓存密钥,而不是使用用户的缓存密钥使集合过期,如图所示。例如

- cache("user-tasks/#{user.id}-#{user.tasks.maximum(:updated_at).try(:to_i)}") do
  - user.tasks.each do |task|
    - cache task do
      # do something with task

- cache("user-searches/#{user.id}-#{user.saved_searches.maximum(:updated_at).try(:to_i)}") do
  - user.saved_searches.each do |search|
    - cache search do
      # do something with search

看看我以前对一个非常类似问题的回答。如果我正确阅读了您的代码,user.tasks仍将被执行。此外,它将始终被执行,因此这是一个比当前代码更糟糕的选项。这与使用缓存user相同,user.tasks在更新一个任务时仍将被执行是的,这可能是您想要的-您询问在更新搜索时不执行user.tasks,在本例中,这是不对的。对不起,这个问题已经问了两年了。虽然你所拥有的可能会起作用,但一个大问题是,每次你点击该页面时,它都会通过所有任务和保存的搜索。