我們的應用程序在控制器中使用Rails.cache
來緩存視圖範圍之外的某些項目(如元標記),然後在視圖的大部分上使用fragment_caching。Rails是否有用於過期緩存的標籤?
視圖緩存一個主模型,但我們已經從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
我的果阿L:
- 我: 「哦,頁面@cache_key發生了變化,讓我們終止它!」
- 的Rails:
Okay, easy!
- 我: 「一個類似的網頁,改變了他們的第一張照片,我該怎麼辦?」
- 的Rails:
Umm... #(*$^*@ .. does ... not ... compute.
一些緩存系統比別人有更多的功能。你打算使用哪個? – tadman 2011-04-14 15:07:26
我還沒有找到一個支持類標籤系統。內置緩存,cache_fu和cache_money都不支持標籤類系統。 – Kelly 2011-04-14 15:09:48
你看過創建一個Observer來爲你管理嗎? – tadman 2011-04-14 16:00:50