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?我在日志中看不到"在这里提交".它适用于破坏就好了.
方法after_commit是每当保存记录时,它都会被添加到记录列表中.当事务被提交时,rails会遍历该列表,并在每个列表上调用after commit hook.
当你这样做时update_all,实例不会单独保存(因为它们实际上根本没有加载 - rails实际上并不知道哪些行已更新),因此它们不会被添加到强大的列表中after_commit.
destroy_all是不同的,因为它确实加载所有实例并逐个删除它们,触发所有回调.update_all如果你使用的话,你会发现类似的行为delete_all
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |