2010-12-03 9 views
0

memcachedに問題があります。私は私のコントローラでは、ここでhttp://railslab.newrelic.com/2009/02/19/episode-8-memcachedエラーを取得するRailsで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がキャッシュに追加されます。 2回目に同じコマンドを実行すると、私は凍ったエラーが出ます。

私はRails 3.0.1を使用しており、開発モードで作業しています。

ここで何か問題がありますか?

ありがとうございます!

チーム

答えて

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

2

これをRails 3で実行している場合、Railsが遅延ロードするため、レコードをフェッチするためにarelが使用されていることに注意してください。したがって、保存しているのは、技術的には記録的な関係です。

したがって、この問題をmemcachedに保存する前に、arelの.to_aメソッドを使用する必要があります。これにより、オブジェクトを格納する前に配列になります。

すなわち@posts = Post.recent.to_a

ホープこれは誰かに役立ちます。

関連する問題