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 会遍历该列表,并在每个列表上调用 after commit 钩子。

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

destroy_all是不同的,因为它确实加载所有实例并一一删除它们,触发所有回调。update_all如果您使用过,您会观察到类似的行为delete_all

于 2012-06-06T22:53:39.377 回答