2011-04-18 18 views
8

我在我的應用程序因爲這些類別顯示在每個頁面上如何緩存on Rails的3

@categories = Category.joins(:posts).select('distinct categories.*').order('label') 

以下查詢這個查詢被加載在每次瀏覽網頁在Ruby中查詢。這對我來說似乎很混亂,因爲類別列表並沒有經常更新。有沒有一種漂亮的方式來緩存查詢?我已經嘗試

Category.cache do 
     @categories = Category.joins(:posts).select('distinct categories.*').order('label') 
    end 

但我仍然看到查詢從開發日誌中的數據庫中每次獲取加載。

+1

緩存默認情況下,在開發模式下關閉。查看'config/environments/development.rb'來打開它。 – 2011-04-18 23:13:40

+1

@Douglas F Shearer該設置控制是否對每個請求緩存或重新加載Ruby類,而不管是否啓用了Active Record的查詢緩存。 – 2011-04-19 10:12:41

回答

18

在你的控制器,你可以嘗試這樣的:

@categories = Rails.cache.fetch('categories', :expires_in => 24.hours) { Category.joins(:posts).select('distinct categories.*').order('label') } 

這隻會讀,看看下面的數據塊「類」已經被緩存並沒有過期。如果24小時後過期,則會查詢模型並將新記錄寫入Rails緩存。

欲瞭解更多信息,我遵循以下guide

試一試。我以這種方式工作。希望有所幫助。

+0

請注意,這僅適用於某些緩存存儲 – 2011-04-19 10:25:54

4

您可以對顯示類別的部分視圖模板使用片段緩存。這意味着類別將從緩存存儲中提供,查詢將只執行一次,直到緩存過期(使用expire_fragment方法)。

+0

由於片段緩存利用俄羅斯娃娃緩存,因此與http://stackoverflow.com/a/5712011/61048中提供的解決方案相比,顯示數據的一致視圖更容易,它可以在24小時內與底層數據過時,或者必須明確無效。 – 2016-09-02 16:35:47

相關問題