gpt4 book ai didi

ruby-on-rails - update_all 之后没有调用 after_commit

转载 作者:行者123 更新时间:2023-12-02 01:53:39 26 4
gpt4 key购买 nike

我的 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 没有被触发?我在日志中没有看到“在此处提交”。它可以很好地用于销毁。

最佳答案

方式after_commit工作原理是,每当保存记录时,它就会添加到记录列表中。当事务提交时,rails 会迭代该列表,调用每个事务上的提交后 Hook 。

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

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

关于ruby-on-rails - update_all 之后没有调用 after_commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10921919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com