跳过after_commit进行销毁

dim*_*mid 4 ruby activerecord ruby-on-rails

我想跳过一个对象after_commit时的回调destroy,而无需使用on语法明确指定方法列表。即类似:

after_commit :foo, except: [:destroy]
Run Code Online (Sandbox Code Playgroud)

小智 12

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

after_save_commit :foo
Run Code Online (Sandbox Code Playgroud)

这将跳过销毁时的回调。


Vik*_*nei 6

最短的解决方案是 @dimid 分享的解决方案,但我相信,现在务实的方法是列出您要处理的事件,然后将:destroy. :on现在有 3 个可用选项: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


dim*_*mid 5

我已经在Ruby Tips中找到了一种方法:

after_commit :foo, if: :persisted?
Run Code Online (Sandbox Code Playgroud)

或更复杂的条件:

after_commit, :foo, if: Proc.new {|record| record.persisted? && [...]}
Run Code Online (Sandbox Code Playgroud)