我看到一个场景,我有这样的东西:
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的回答中所说,create
和update
动作可能有不同的条件(这些条件可能很复杂(。我最终得到了:
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.