我有一个带有
after_commit
的 UserObserver(从 after_create
更改以避免 id 未找到的竞争条件错误)来更新计数。但我知道对于每个创建,更新都会执行 after_commit
代码(我知道会发生)。如何仅在创建时运行 after_commit
?我的解决方案很少,但有点困惑。我试过了:
after_commit :do_something, :on => :create
。created_at
和updated_at
;如果相同,那就是新记录。user.new_record?
我很困惑,因为我想使用第三个,但它不起作用,我不知道为什么。我只想使用观察者而不是模型。对此有什么想法吗?
从rails 5开始,Rails添加了三个新的别名来处理这种情况:
after_create_commit
、after_update_commit
、after_destroy_commit
根据您自己的具体情况,您可以使用:
after_create_commit :do_something
.
根据文档,使用
on: :create
应该可以工作:http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#method-i-after_commit
仅供参考,接受的答案在许多版本的 Rails 中不起作用,并且是一个错误。此票证引用了具有相同名称的多个回调的不同问题。然而,在许多 Rails 版本中,该错误仍然存在(任何 after_commit on:create 都不起作用)。
“seako”有一个解决方法来解决这个问题(如果您遇到此问题)
https://github.com/rails/rails/issues/988
after_commit ->(obj) { obj.do_something }, on: :create