2010-12-03 25 views
0

我遇到memcached問題。獲取錯誤無法在Rails中使用memcached時修改凍結對象

我使用的是例如通過格雷格·波拉克這裏http://railslab.newrelic.com/2009/02/19/episode-8-memcached

post.rb

def self.recent 
    Rails.cache.fetch('recent_posts', :expires_in => 15.minutes) do 
     self.order('id DESC').limit(15) 
    end 
end 

在我控制我@posts = Post.recent調用它,它的寫入緩存。如果我重新加載頁面,我會收到錯誤TypeError: can't modify frozen object

我在控制檯中嘗試了同樣的事情,並得到相同的錯誤。我第一次執行@posts = Post.recent時,關鍵的recent_posts被添加到緩存中。當我第二次執行相同的命令時,我得到了凍結錯誤。

我正在使用Rails 3.0.1並在開發模式下工作。

我在這裏做錯了什麼?

謝謝!

Tim

回答

7

您正在緩存排序選項,而不是任何實際結果。當你執行查詢時,Rails將修改你的查詢選項,這將不起作用,因爲來自緩存的內容被認爲是不可變的。

試試這個:

def self.recent 
    Rails.cache.fetch('recent_posts', :expires_in => 15.minutes) do 
    self.order("id DESC").limit(15).all 
    end 
end 

現在,你存儲的帖子,你可以在以後使用數組。

+0

這就像一個魅力。學過的知識。謝謝! – Tim 2010-12-03 18:23:04

2

請注意,如果你在Rails 3中這樣做,因爲Rails現在延遲加載,arel被用來獲取記錄。所以你存儲的技術上是一個活躍的記錄關係。

所以你需要解決這個問題之前,在存儲在memcached一個la .to_a方法上的arel。這將在存儲對象之前使它成爲一個數組。

即@posts = Post.recent.to_a

希望這可以幫助別人。

相關問題