【发布时间】:2011-08-05 15:04:43
【问题描述】:
我们的应用在控制器中使用Rails.cache 来缓存视图范围之外的一些项目(如元标记),然后在大部分视图上使用fragment_caching。
视图缓存了一个主模型,但我们在该主缓存中使用了来自 5 个其他模型(未通过关联连接)的数据。使用主模型上的清扫器很容易使片段过期,但那些附加模型也会发生变化,需要触发此页面过期。
我们不能使用正则表达式路由来删除缓存键,因为我们只能通过主模型引用这个缓存条目——其他模型由我们在控制器的缓存块内执行的昂贵查询确定.
Rails 3 是否有办法本质上使用 tags 来标记缓存条目,所以当页面上的 6 个模型中的任何一个发生变化时,我们可以将其丢弃,但我们仍然可以找到缓存条目仅来自主模型的密钥?
这里有一些虚拟代码来表达这个想法:
在控制器中
@cache_key = "/page/#{params[:name]}/#{params[:id]}"
unless fragment_exist? ( { :slug => @cache_key })
# run our processes here that will be needed in the view,
# then cache the data that is used outside the view
Rails.cache.write(@cache_key, { (data goes here) } )
# run our expensive query here:
@similar_pages = Page.pricey_query!.limit(5).all
else
cached = Rails.cache.read(@cache_key)
end
在视图中
- cache( {:slug => @cache_key} ) do
- @similar_pages.each do |page|
= image_tag page.photos.first.image.url
-# more pretty stuff here
我的目标:
- 我:“哦,页面@cache_key 已更改,让我们将其过期!”
-
Rails:
Okay, easy! - 我:“其中一个相似的页面改变了他们的第一张照片,我该怎么办?”
-
导轨:
Umm... #(*$^*@ .. does ... not ... compute.
【问题讨论】:
-
一些缓存系统比其他系统有更多的功能。您打算使用哪个?
-
我还没有找到一个支持类似标签的系统。内置缓存 cache_fu 和 cache_money 都不支持类似标签的系统。
-
你有没有想过创建一个观察者来为你管理这个?
-
我遇到了与 Sweeper 相同的问题——我需要通过一个键访问缓存的项目,但我需要能够通过 6 个“短语”中的任何一个使其过期。我会在问题中解释。
-
也意味着没有一个可用的缓存存储,如 filestore 或 memcached 似乎支持这个概念。
标签: ruby-on-rails caching tags