2011-07-01 3 views
1

モデルに前後のフックがあり、場合によっては他のイベントのオブザーバもある場合は、モデルでセーブ/アップデート操作を実行し、これらのフックのいずれかをスキップすることはできますか?前後のフィルタとオブザーバを持つRailsモデルでは、これらのフックを無視できますか?

私は保存を実行し、何らかの理由でafter_saveイベントを無視するように私のモデルに伝えます。そして、私がそれが何をしても発火させたくないので、この保存をオブザーバに通知しません。

答えて

3

コールバックを実行しないようにskip_callbackメソッドを使用できます。例えばのため:

User.skip_callback(、 "作成":の後、:send_confirmation_email)はafter_createに設定されている名前send_confirmation_emailとコールバックをスキップします。

あなたはバックと同じに設定することができます:User.set_callback(、 "作成":の後、:send_confirmation_email)を

+0

このスレッドセーフですか? –

3

は、私は、このような要件についてupdate_allを使用しています。

# update the name and price of product with id 23 
Product.update_all({:name => "foo bar", :price => 25}, {:id => 23}) 

私も前に、この技術を使用しています。ここ

product.name = "foo" 
product.description = "bar" 
changes = product.changes.inject({}){|h, v| h[v[0]]=v[1][1];h} 
Product.update_all(changes, :id => product) 
product.reload # for good measure.. 

、あなたは通常の方法でオブジェクトを操作している、とあなたがオブジェクトを更新する準備ができたら、あなたは、変更された属性を抽出します。これにより、列をハードコーディングして更新する必要がなくなります。

+0

追加のアプローチで答えを更新しました。 –

+0

'update_all'は私の祈りの答えです。私は 'before_save'を使ってライブ統計を計算していましたが、それは悪夢でした。 – Dex

関連する問題