2013-09-01 70 views
0

我有那種腳本。Rails緩存所有查詢

Search_controller.rb:

def results 
    @users = @search.cached_users_count.page(params[:page]).per_page(10) 
end 

Search.rb型號:

users = users.order('current_sign_in_at DESC') 


def cached_users_count 

    Rails.cache.fetch(["user_count", expires_in: 5.minutes]) { users } 

end 

我想要做的是緩存中的所有查詢,因爲當一些用戶將登錄搜索結果執行後,will_paginate代替結果在下一頁 - 因爲剛登錄的用戶繼續在第一的位置,結果改變爲order by current_sign_in_at

有人可以幫我嗎?現在沒有緩存,每個搜索結果都是sql響應。

回答

2

在您當前的實施中有幾件事需要改變以獲得您要查找的行爲。

  1. 你開始返回一個關係users對象,但只 的範圍,這意味着它是不存儲結果是否符合預期。 要存儲查詢的結果,您需要使用 查詢方法加載它們。使用all如果在Rails 3中,或load如果軌道4,5:

    users.order('current_sign_in_at DESC').all #Rails 3 
    users.order('current_sign_in_at DESC').load #Rails 4, all is deprecated 
    
  2. 的語法Rails的緩存是不正確,如果你真的希望它 到期。您正在通過expires_in作爲密鑰的一部分,這是您當前代碼中的 數組[]。您只想通過正常的 參數,並選擇expires_in作爲選項。

    Rails.cache.fetch("user_count", expires_in: 5.minutes) { users } 
    

查看了類似的問題下面左右爲好: Confusion caching Active Record queries with Rails.cache.fetch