Rails是否具有用于使缓存过期的标签?

| 我们的应用在控制器中使用“ 0”来缓存视图范围之外的某些项目(例如元标记),然后在视图的大部分内容上使用fragment_caching。 该视图缓存了一个主要模型,但是我们在该主要缓存中使用了来自其他5个模型(未通过关联连接)的数据。在主模型上使用清扫器很容易使片段过期,但是那些其他模型也发生了变化,需要触发此页面才能过期。 我们不能使用正则表达式路由来删除缓存键,因为我们只能通过主模型来引用此缓存条目,而其他模型则由我们在控制器的缓存块内执行的昂贵查询所确定。 Rails 3是否有一种从本质上使用标签来标记缓存条目的方法,因此当页面上的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页面已更改,让它过期!\” 滑轨:
Okay, easy!
我:“类似的页面之一更改了第一张照片,我该怎么办?” 滑轨:
Umm... #(*$^*@ .. does ... not ... compute.
    
已邀请:
正如塔德曼(Tadman)在问题评论中指出的那样,我不得不发明自己的解决方案,因为Rails从技术上讲不允许使用我需要的标签。对于那些有兴趣做类似事情的人,这是一个通用的解决方案: 我创建了一个名为table5ѭ的新表:
create_table :similar_pages, {:id => false} do |t|
  t.integer :page_id, :similar_page_id
  # you could also do `t.string :tag_name` or similar
end
add_index :similar_pages, :page_id
add_index :similar_pages, :similar_page_id
从技术上讲,我可以在
Pages
上建立自引用的
has_many
关系,但是我决定不这么做,因为我不需要那样引用。我刚刚创建了一个简单的
SimilarPage
模型:
class SimilarPage < ActiveRecord::Base
  belongs_to :page
  belongs_to :similar_page, :class_name => \'Page\'
end
然后使用
ar-extensions
(因为我很懒,并且因为我想在一个INSERT语句中执行此操作),所以我在缓存块中执行了此操作:
SimilarPage.delete_all(\"page_id = \'#{@page_id}\'\")
SimilarPage.import [:page_id, :similar_page_id], @similar_pages.collect {|s| SimilarPage.new(:page_id=>@page_id,:similar_page_id=>s.id)}
在观察者的
expire_cache_for
方法中,我这样做:
SimilarPage.where(:similar_page_id => expiring_page.id).all.each do |s|
  ActionController::Base.new.expire_fragment(/page_show__#{s.page_id}__.*/) 
  # the regexp is for different currencies being cached ^
  Rails.cache.delete(\"page_show_#{s.page_id}\")
end
    
在此视频中,有很好的解释说明Rails如何为内容过期生成标签:http://railslab.newrelic.com/2009/02/19/episode-8-memcached 如果将整个对象传递到缓存中,则将生成一个缓存密钥,该缓存密钥使用时间戳记,该时间戳记将在您更改对象时更新。     
收银员可能会有所帮助。 \“基于标签的缓存\”
# in your view
cache @some_record, :tag => \'some-component\'

# later
Cashier.expire \'some-component\'
https://github.com/twinturbo/cashier     

要回复问题请先登录注册