after_commit没有被调用

Ron*_*ity 3 activerecord ruby-on-rails

我有after_commit设置为folllows.

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

  # ...
end
Run Code Online (Sandbox Code Playgroud)

然后我在事务中包装update_all,它不会触发回调,它应该触发一个回调.

MyModel.transaction do
  MyModel.update_all(col: 'awesome')
end
Run Code Online (Sandbox Code Playgroud)

为什么不发布after_commit?我在日志中看不到"在这里提交".它适用于破坏就好了.

Fre*_*ung 6

方法after_commit是每当保存记录时,它都会被添加到记录列表中.当事务被提交时,rails会遍历该列表,并在每个列表上调用after commit hook.

当你这样做时update_all,实例不会单独保存(因为它们实际上根本没有加载 - rails实际上并不知道哪些行已更新),因此它们不会被添加到强大的列表中after_commit.

destroy_all是不同的,因为它确实加载所有实例并逐个删除它们,触发所有回调.update_all如果你使用的话,你会发现类似的行为delete_all

  • 嗯,这很不幸.你认为after_commit会在*之后触发*它执行*COMMIT*.谢谢. (2认同)