after_commit没有被调用

时间:2012-06-06 20:39:57

标签: ruby-on-rails activerecord

我将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?我在日志中看不到“在这里提交”。它适用于销毁很好。

1 个答案:

答案 0 :(得分:6)

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

执行update_all时,实例不会单独保存(因为它们实际上根本没有加载 - rails实际上并不知道哪些行已更新),因此它们不会被添加到列出权力after_commit

destroy_all是不同的,因为它确实加载所有实例并逐个删除它们,触发所有回调。如果您使用update_all

,则会发现与delete_all类似的行为