2012-09-06 119 views
1

我試圖根據他們的配置文件有多少個視圖在我的主頁上列出用戶。用戶分頁,並且我試圖緩存用戶並在配置文件獲取新視圖時使該緩存失效。Rails保持緩存查詢而不是查詢的結果

我的控制器代碼:

def index 
    @users = Rails.cache.read(params[:page]) 
    if [email protected]? 
    flash[:info] = "Cache was hit." 
    else 
    flash[:info] = "Miss." 
    @users = User.paginate(page: params[:page], per_page: 5, order: "views DESC") 
    Rails.cache.write(params[:page], @users) 
    end 
end 

當我第一次去2頁,我得到預期高速緩存未命中,當我刷新,我得到一個高速緩存命中,也符合市場預期。但是,當我通過控制檯手動更改了用戶的views並刷新了第2頁時,我在控制檯中所做的更改影響了頁面,即使該頁面應該從緩存中呈現。頂部的通知仍然表示「Cache被擊中」。

在控制檯中運行Rails.cache.read("2")拉了一下我的控制器高速緩存給了我這個:

User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY views DESC LIMIT 5 OFFSET 0 
(0.2ms) SELECT COUNT(*) FROM "users" 
=> users freshly pulled from the database 

手動緩存通過控制檯沒有顯示查詢User.paginate值時Rails.cache.read被稱爲:

test = User.paginate(page: 1, order: "views DESC") 
=> users freshly pulled from the database 
Rails.cache.write("9", test) 
=> true 
Rails.cache.read("9") 
=> users from test; no queries displayed above this 

我不知道爲什麼我的控制器代碼緩存查詢而不是結果。任何建議將不勝感激。

回答

0

IIRC ActiveRecord現在是「懶惰」,你只是緩存查詢對象。在User.paginate()之後嘗試追加.all來強制sql運行,給你一個緩存結果集。

如果.all失敗,請嘗試使用.map/.select/.inject。

+0

謝謝!使用'.all'解決了這個問題。不知道ActiveRecord是懶惰的。 – user1650177