2012-09-20 22 views
2

我使用Rails.cache(我曾經嘗試都默認存儲,並與達利寶石memcached的 - 但我得到相同的行爲),它似乎是工作,而不是(日誌顯示,查詢不言,但實際結果表明否則)......我有1天緩存十大查詢搜索頁面:Rails.cache - 工作,但沒有工作

search.rb

def self.top_ten 
    Rails.cache.fetch("top_ten_searches_cache", :expires_in => 1.day) do 
     Search.order("count DESC").limit(10) 
    end  
    end 

然而,當我進入搜索頁面並重復輸入新的搜索詞時,它將開始顯示前十名的結果! (而我並不期望前十名結果要改變,直到1天過去。)當緩存存儲爲默認值時,日誌中不顯示任何查詢(因此您認爲緩存正在運行),並且在使用dalli/memcached時,我會得到完全相同的結果行爲,但與此日誌中:

Cache read: top_ten_searches_cache ({:expires_in=>1 day}) 
Cache fetch_hit: top_ten_searches_cache ({:expires_in=>1 day}) 

Cache fetch_hit是什麼意思?這是否意味着沒有找到緩存並且必須執行查詢?

不確定發生了什麼 - 奇怪的是,我使用Dalli獲得了默認存儲或memcached的相同行爲。

回答

11

您正在緩存範圍,而不是查詢的實際結果。 Rails使用延遲加載,所以要強制查詢來執行,你需要把(在軌或.all 3).to_a,例如:

def self.top_ten 
    Rails.cache.fetch("top_ten_searches_cache", :expires_in => 1.day) do 
    Search.order("count DESC").limit(10).to_a 
    end  
end 

here

+0

嗨邁克 - 謝謝,我怎麼能忘記這一點!我按照你的例子改變了查詢,但是,我仍然得到相同的行爲 - 如果我搜索一個約5次的新術語,它會顯示在前十名單中,而且我不希望更改爲24小時(因爲它應該返回緩存值)。我做錯了什麼嗎? – A4J

+0

啊我想我知道發生了什麼...我需要刷新緩存,因爲它保留了舊的值... – A4J

+0

是的,Rails.cache.clear做了訣竅 - 謝謝! – A4J