为什么 after_create_commit 的存在使我的 after_update_commit 永远不会触发?

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,它确实有效。

  • 最后宣布的一方获胜。
  • 似乎仅适用于 _commit 回调
  • 仅发生在同一方法的多个回调中

这是 Rails 的错误还是有原因?

导轨 6.1.4.6

Joh*_*hir 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)