2011-07-07 15 views
1

セッションのuser_id値がcookieに格納され、残りのモデルデータ(first_name、last_name、usernameなど)がredisに格納されるredisストアを設定しています。私はレディスにとってはとても新しいので、モデルデータをどのように保存するのか分かりません。Railsはシリアル化されたモデルレコードを取得します

私は2つの質問している:それを格納するための最良の方法は何、私はXML、JSONやルビーのオブジェクトと等価でそれを

  1. をシリアル化する必要があります。

  2. 保存されたデータをフェッチすると、そのデータを実際のモデルオブジェクトにどのように変換できますか?私がuser_fetched_from_redis.usernameを実行すると、user_fetched_from_db.usernameのようになります。また、redisストアからフェッチされないフィールドがある場合は、activerecordがSELECT * FROMステートメントを実行して、オブジェクト内のすべての属性を設定するようにします。これは可能ですか?

答えて

1

resqueがこれをどのように処理するかを見てください。基本的には、XMLやダンプされたRubyオブジェクトの代わりにJSONオブジェクトを使用しているので、オーバーヘッドが少ないという同じアプローチを使用することを推奨します。 Railsは、ActiveRecordインスタンスを含む多くの異なるオブジェクトに対して非常に単純な.to_json機能を提供します。

JSONを使用してオブジェクトをシリアライズすると、デシリアライズ時に通常のハッシュに展開されます。属性を継承するカスタムクラスを作成し、method_missingを使用してjsonオブジェクトから属性を取得するか、関連するデータベースレコードをロードすることは難しくありません。このようなものはうまくいくはずです:

class CachedObject 
    attr_accessor :attributes 

    def initialize(json) 
    self.attributes = ActiveSupport::JSON.decode(json) 
    end 

    def method_missing(method) 
    attributes[method.to_s] || Model.find_by_id(attributes['id']).send(method) 
    end 
end 

obj = CachedObject.new('{"id":"123","foo":"some value"}') 
p obj.foo # => "some value" 
p obj.bar # => Executes `Model.find_by_id(123).bar` 
関連する問題