2015-10-27 17 views
5

私はuser_dataテーブルにさまざまなデータを格納していますが、私が定義した関連付けでそのデータを取得すると、実際にRubyインスタンス変数キャッシュを使用してキャッシングしています。パラメータに基づいたRuby on Railsインスタンス変数のキャッシング

def user_data(user_id) 
    @user_data || = User.find(user_id).data 
end 
それがnilだと、それはユーザーのためのデータを保持したら1に等しいuser_idのために言うことができます、と私はこの方法でUSER_ID 2を渡していたときに、それがデータを返すのです

が、インスタンス変数@user_data割り振られる値のみ初めてuser_id 1のために、私はそれが機能のパラメータに基づいて値をキャッシュすることができるように私はそれが新しい値を割り当てないので、私の質問です。

答えて

7

Caching with Rails guideをご覧ください。 Railsは、フル・ページ・キャッシュからフラグメント・キャッシングまで、複数のレベルのデータをキャッシュすることができます。このページをすべて読んで、知覚される選択をすることを強くお勧めします。

低レベルのキャッシングのためには、これを行うことができます:デフォルトのRailsの店によって

@user_data = Rails.cache.fetch("user_#{user_id}", expires_in: 1.hour) do 
    User.find(user_id).data 
end 

がディスク上にキャッシュしますが、memcacheの、メモリストアのセットアップができ、など

+0

これは、Railsキャッシュを使用して実装する方法です。これは、インスタンス変数キャッシングと混同されることはありませんが、その問題についてです。 Upvoted :-) – kaspernj

1

あなたが使用することができますキーベースのintance-variable-cacheのハッシュ私はそれがあなたが望むことをすると思います。

def user_data(user_id) 
    @user_data ||= {} 
    @user_data[user_id.to_i] || = User.find(user_id).data 
end