2013-03-13 36 views
1

我有一个用户可以有很多保存的搜索和大量的任务。我使用以下使用俄罗斯娃娃手动过期缓存

- 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宝石之前一直在做的,但我无法弄清楚如何做到这一点。

+0

看看我以前的答案,以一个非常类似的问题。 http://stackoverflow.com/questions/15194270/rails-cache-key-generated-as-activerecordrelation/15206742#15206742 – 2013-03-13 15:01:13

+0

如果我读了你的代码,'user.tasks'仍然会被执行。此外,它将始终执行,因此它是当前代码的更糟糕的选项。 – jvnill 2013-03-13 19:09:00

回答

0

而不是使用用户的缓存键过期收集,您可以使用集合的最新updated_at,as the Rails Guide on caching演示。例如。

- 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 
+0

这与使用'cache user''相同,'user.tasks'仍然会在一个任务更新时执行 – jvnill 2015-03-09 01:12:26

+0

是的,这可能是你想要的 - 当你更新_search_时询问你没有执行'user.tasks' ,在这种情况下它不会。 – phillbaker 2015-03-12 03:00:13

+0

啊对。对不起,这个问题已经在2年前问过了。尽管你有什么可能会起作用,但一个大问题是,每当你点击该页面时,它都会经历所有的任务和保存的搜索。 – jvnill 2015-03-12 06:21:59