在rails中删除after_commit on destroy

时间:2016-06-30 08:54:03

标签: ruby-on-rails ruby activerecord

我希望在after_commit对象时跳过destroy回调,而不使用on语法明确指定方法列表。即类似的东西:

after_commit :foo, except: [:destroy]

3 个答案:

答案 0 :(得分:3)

我已经找到了在Ruby Tips上执行此操作的方法:

after_commit :foo, if: :persisted?

或更复杂的条件:

after_commit, :foo, if: Proc.new {|record| record.persisted? && [...]}

答案 1 :(得分:3)

Rails 6 中,您可以使用 after_save_commit 作为 after_commit :foo, on: [:create, :update] 的快捷方式

after_save_commit :foo

这将跳过销毁回调。

答案 2 :(得分:2)

最短的解决方案是@dimid共享的解决方案,但我相信,现在务实的方法是列出您要处理的事件,而忽略:destroy。目前有3个可用的:on选项,:create:update:destroy

在创建&上执行foo更新:

after_commit :foo, :on => [:create, :update]

可替换地:

after_commit :foo, on: :create after_commit :foo, on: :update

或者从Rails 5(https://github.com/rails/rails/pull/22516)开始,也可以:

after_create_commit :foo after_update_commit :foo