为什么after_create_commit的存在使我的after_update_commit永远不会启动



我看到一个场景,我有这样的东西:

class User
def thing; puts "hello"; end
after_update_commit :thing
after_create_commit :thing
end

after_update_commit在执行user.update first_name: rand时从不激发但如果我注释掉after_create_commit,它确实有效。

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

这是Rails错误还是有原因?

轨道6.1.4.6

https://guides.rubyonrails.org/active_record_callbacks.html#transaction-回调

使用具有相同方法名称的after_create_commit和after_update_commit将只允许定义的最后一个回调生效,因为它们都在内部别名为after_commit,后者将覆盖以前定义的具有相同方法名的回调。

解决方案,如果不具备条件:

after_commit :thing, on: [:update, :create]

解决方案,如果确实有条件(在这种情况下,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

正如John Bachir的回答中所说,createupdate动作可能有不同的条件(这些条件可能很复杂(。我最终得到了:

class User
def thing; puts "hello"; end
after_commit :thing_on_create, on: :create, if: :create_condition?
after_commit :thing_on_update, on: :update, if: :update_condition?
alias_method :thing_on_create, :thing
alias_method :thing_on_update, :thing
def create_condition?
Time.now.monday?
end
def update_condition?
active?
end
end

它的可读性稍高(并且不影响方法本身(IMO.

相关内容

  • 没有找到相关文章

最新更新