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