モデルに前後のフックがあり、場合によっては他のイベントのオブザーバもある場合は、モデルでセーブ/アップデート操作を実行し、これらのフックのいずれかをスキップすることはできますか?前後のフィルタとオブザーバを持つRailsモデルでは、これらのフックを無視できますか?
私は保存を実行し、何らかの理由でafter_saveイベントを無視するように私のモデルに伝えます。そして、私がそれが何をしても発火させたくないので、この保存をオブザーバに通知しません。
モデルに前後のフックがあり、場合によっては他のイベントのオブザーバもある場合は、モデルでセーブ/アップデート操作を実行し、これらのフックのいずれかをスキップすることはできますか?前後のフィルタとオブザーバを持つRailsモデルでは、これらのフックを無視できますか?
私は保存を実行し、何らかの理由でafter_saveイベントを無視するように私のモデルに伝えます。そして、私がそれが何をしても発火させたくないので、この保存をオブザーバに通知しません。
コールバックを実行しないようにskip_callbackメソッドを使用できます。例えばのため:
User.skip_callback(、 "作成":の後、:send_confirmation_email)はafter_createに設定されている名前send_confirmation_emailとコールバックをスキップします。
あなたはバックと同じに設定することができます:User.set_callback(、 "作成":の後、:send_confirmation_email)を
は、私は、このような要件について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..
、あなたは通常の方法でオブジェクトを操作している、とあなたがオブジェクトを更新する準備ができたら、あなたは、変更された属性を抽出します。これにより、列をハードコーディングして更新する必要がなくなります。
追加のアプローチで答えを更新しました。 –
'update_all'は私の祈りの答えです。私は 'before_save'を使ってライブ統計を計算していましたが、それは悪夢でした。 – Dex
このスレッドセーフですか? –