2009-03-26 8 views
3

私はモデルを持っており、性能上の理由から関連するオブジェクトのid(非正規化)を保存したいと考えています。関連するオブジェクトの一部が新しいレコードであるかもしれないので、彼らがidを持っていない - しかし、問題があり、関連するオブジェクトがすべて保存された後のアクティブレコード - コールバック

def cache_ids 
    self._tag_ids = self.tag_ids 
end 

私はちょうどbefore_save上でそれを実行すると考えていた:私はこのようになります方法を持っています。

私はafter_saveに切り替えましたが、トランザクションがコミットされる前にこのコールバックがトリガーされているように見えるため、IDはまだ設定されていません。私が終わった瞬間に

def save_with_idcache(*args) 
    return false unless save_without_idcache(*args) 

    cache_ids 

    return save_without_idcache(false) 
end 

alias_method_chain :save, :idcache 

動作するようですが、非常にエレガントに見えるしません。

もっと良い方法がありますか?同様に、オブジェクトと関連オブジェクトがすべて保存された後のコールバック?

多分私は何かが明らかでない。

+0

あなたがしようとしていることは100%ではありませんが、私には少しのにおいがします。関連する要素のIDを取得することは、単一の問い合わせによって行うことができます...? –

+0

私はTobyに同意します。関連するオブジェクトやIDを単一のクエリで取り戻すことができます。それらをキャッシュするドライバは何ですか? – RichH

答えて

0

after_createも使用できますか? idはそこにいます。

1

あなたは逆にそれを試してみてください - (彼らは協会から削除および/または新規に追加されている場合)after_save、関連オブジェクトが親の_tag_idsafter_createでを更新しており、after_destroy

これがより良い解決策であるかどうかは、そこにどれだけ含まれているか、それらをどのくらい動かしているか、さらに汚い属性についてどの程度慎重にしたいかによって決まります。

関連する問題