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)
这将跳过销毁时的回调。
最短的解决方案是 @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
我已经在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)