我将after_commit设置为folllows。
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?我在日志中看不到“在这里提交”。它适用于销毁很好。
答案 0 :(得分:6)
after_commit
的工作方式是每当保存记录时,它都会被添加到记录列表中。当事务被提交时,rails会遍历该列表,并在每个列表上调用after commit hook。
执行update_all
时,实例不会单独保存(因为它们实际上根本没有加载 - rails实际上并不知道哪些行已更新),因此它们不会被添加到列出权力after_commit
。
destroy_all
是不同的,因为它确实加载所有实例并逐个删除它们,触发所有回调。如果您使用update_all
delete_all
类似的行为