4

私はafter_commitを次のように設定しています。

class MyModel < ActiveRecord::Base
  after_commit { Rails.logger.info ("commit here") }

  # ...
end

次に、コールバックを発生させることになっているトランザクション内に、コールバックを発生させないupdate_allをラップします。

MyModel.transaction do
  MyModel.update_all(col: 'awesome')
end

after_commitが起動されないのはなぜですか?ログに「ここでコミット」が表示されません。それはうまく破壊するために働きます。

4

1 に答える 1

9

動作する方法after_commitは、レコードが保存されるたびに、レコードのリストに追加されることです。トランザクションがコミットされると、railsはそのリストを繰り返し処理し、それぞれにaftercommitフックを呼び出します。

これを行うとupdate_all、インスタンスは個別に保存されないため(実際にはまったくロードされないため、railsは実際に更新された行を認識しません)、そのため、インスタンスはそのパワーのリストに追加されませんafter_commit

destroy_all実際にはすべてのインスタンスをロードして1つずつ削除し、すべてのコールバックを起動するため、違います。update_all使用した場合と同様の動作が見られますdelete_all

于 2012-06-06T22:53:39.377 に答える