вручную удалить кеш с помощью Russian Doll

у меня есть пользователь, у которого может быть много сохраненных поисков и много задач. я кэширую их, используя следующие

- 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

Я добавил возможность обновлять пользователя с помощью опции touch всякий раз, когда обновляется какая-либо из этих записей. проблема, которую я хочу прояснить, заключается в следующем сценарии:

Я обновил поиск, в котором истекает срок действия кеша для этого поиска и, по сути, кеша для пользователя. поскольку срок действия кеша для пользователя истек, будет выполнено user.tasks.

Есть ли способ предотвратить это?

Я подумываю добавить ключ к cache user и вручную истечь срок действия кеша, что я делал до того, как использовал cache_digest драгоценный камень, но я не могу понять, как это сделать.


person jvnill    schedule 13.03.2013    source источник
comment
Посмотрите мой предыдущий ответ на очень похожую проблему. stackoverflow.com/questions/ 15194270 /   -  person Mark Stratmann    schedule 13.03.2013
comment
если я правильно прочитал ваш код, user.tasks все равно будет выполняться. более того, он всегда будет выполняться, так что это худший вариант, чем текущий код.   -  person jvnill    schedule 13.03.2013


Ответы (1)


Вместо использования ключа кэша пользователя для истечения срока хранения коллекций вы можете использовать последний updated_at коллекций, как показано в руководстве Rails по кешированию. Например.

- 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
person phillbaker    schedule 08.03.2015
comment
то же самое с использованием cache user, user.tasks по-прежнему будет выполняться при обновлении одной задачи - person jvnill; 09.03.2015
comment
Да, это, вероятно, то, что вы хотите - вы спросили, не выполнять user.tasks при обновлении search, чего в данном случае не будет. - person phillbaker; 12.03.2015
comment
ах, верно. извините, этот вопрос был задан 2 года назад. хотя то, что у вас есть, может работать, большая проблема заключается в том, что он выполняет все задачи и сохраняет поиск каждый раз, когда вы попадаете на эту страницу. - person jvnill; 12.03.2015