Joh*_*hir 1 activerecord ruby-on-rails rails-activerecord
我看到一个场景,我有这样的事情:
class User
def thing; puts "hello"; end
after_update_commit :thing
after_create_commit :thing
end
Run Code Online (Sandbox Code Playgroud)
after_update_commit执行时永远不会触发,user.update first_name: rand
但如果我注释掉after_create_commit,它确实有效。
这是 Rails 的错误还是有原因?
导轨 6.1.4.6
https://guides.rubyonrails.org/active_record_callbacks.html#transaction-callbacks
同时使用 after_create_commit 和 after_update_commit 具有相同的方法名称将只允许定义的最后一个回调生效,因为它们都在内部别名为 after_commit ,后者会覆盖先前定义的具有相同方法名称的回调。
不具备条件的解决办法:
after_commit :thing, on: [:update, :create]
Run Code Online (Sandbox Code Playgroud)
如果确实有条件,则解决方案(在本例中,is_active?更新时)
after_commit :thing, on: [:update, :create]
def thing
# id_previously_changed? is only true when record is created
unless id_previously_changed?
return unless is_active?
end
# ...
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2859 次 |
| 最近记录: |