2012-01-27 8 views
1

私は自分のRailsアプリにキャッシュを追加していると私はやっていることの一つは、(代わりに.createの).new方法を使用してActiveRecordのモデルをインスタンス化されるので、それは新しい行を作成しようとしません。例えばキャッシュからActiveRecordモデルをインスタンス化するにはどうすればよいですか?

、私は私のモデルにこれを追加した場合:

def from_json(json) 
    o = self.new 
    ActiveSupport::JSON.decode(json).each do |k, v| 
    # NOTE: I am doing this instead of sending all the params to .new 
    #  because Rails won't let me bulk update protected attributes 
    o.send(k + '=', v) 
    end 
    o 
end 

そして、キャッシュからオブジェクトインスタンス化:私は、フィールドを変更しようとするまで

o = Foo.from_json(redis.get(key)) 

すべてがうまく動作しているように:

これは重複するエントリであるという例外があります。

は、どのように私はこの実際にはそれが投げると例外の代わりにその行を更新するようにデータベースにすでに存在する行を指していることはActiveRecordを教えていますか?

+0

あなたがしようとしていることを理解することは本当に難しいです。 – lucapette

答えて

3

私が必要との回答はlib/active_record/base.rbで発見されました。 new_recordfalseに設定してオブジェクトを初期化する必要があります。これを行うには、オブジェクトを割り当ててからinit_withで初期化する必要があります。定義されたコーダーを使用して特別なserialized_attributesを適切にシリアル化する必要があることに注意してください。

レール3.1を使用しています。

def serialize_for_cache 
    h = self.attributes.clone 
    self.class.serialized_attributes.each do |key, coder| 
    h[key] = coder.dump(h[key]) 
    end 
    ActiveSupport::JSON.encode(h) 
end 

def deserialize_from_cache(json) 
    self.allocate.init_with('attributes' => ActiveSupport::JSON.decode(json)) 
end 
関連する問題