2013-09-01 103 views
0

我在這裏提出了許多關於緩存的問題,但沒有人回答。所以mayby我會回答這個問題。Rails查詢緩存而不刷新元素更新

我在我的搜索模型這樣的代碼:

users = users.where('id >?', my_value) 

Rails.cache.fetch('my_cached',expires_in: 3.minutes) do 

    users = users.order('current_sign_in_at DESC') 

end 

有人能解釋我這是什麼做的。我認爲這將返回排序的用戶表,並將其放入緩存中3分鐘,所以當我需要下一次搜索時,如果它未過期,它將返回my_cached結果。

但它不起作用。當某些用戶登錄和current_sign_in_at更改時 - 緩存被覆蓋並返回新查詢。

+0

我想緩存在默認情況下是在發展模式中被禁用?這可能會有所幫助 - http://stackoverflow.com/questions/5636299/rails3-caching-in-development-mode-with-rails-cache-fetch?answertab=active#tab-top – house9

回答

0

我對RoR的緩存過程並不是很有經驗,但我認爲你說的是​​對的。

我認爲這將返回排序的用戶表,並把它放在高速緩存 3分鐘,所以當我需要一次搜索將返回我 my_cached的結果,如果它不到期。

然後,我認爲應該緩存在這件事上做:

Rails.cache.fetch('my_cached',expires_in: 3.minutes) do 
    User.where('id >?', my_value).order('current_sign_in_at DESC') 
end 

記住,可能存在一些規則,可以分配過期時間之前到期的高速緩存。這取決於如何配置用戶模型。

同樣,只有在使用變量my_cached時纔會執行查詢。也許你看到查詢是從另一程序來(也許從設計本身,如果你使用它嗎?)

一些有用的參考

UPDATE

如果變量my_value頻繁更改(可能是偶然值),則僅當my_value與之前(3分鐘)值相同時纔會使用高速緩存。

也許一個變量my_value的替代解決方案可以是:

Rails.cache.fetch('my_cached',expires_in: 3.minutes) do 
    User.all # cache all users 
end 
# then filter the cached value by the my_value and order it 
+0

即時消息讀取它,如果我理解這個唯一的返回範圍爲主動關係,所以當下一次搜索被作出範圍變化並且將其保存在緩存中時。我必須做一些其他的事情 - 爲緩存中的用戶保存ID,然後查看顯示返回ID爲 – Wordica

+0

@Michael的用戶,如果我已經正確理解你想要做什麼,我已經更新了我的答案 – damoiser