仅在create上使用after_commit

时间:2014-12-18 16:36:19

标签: ruby-on-rails ruby-on-rails-3 observers

我有一个UserObserver after_commit(从after_create更改以避免未找到ID的竞争条件错误)来更新计数。但我知道每次创建时,更新都会执行after_commit代码(我知道会发生这种情况)。如何仅在创建时运行after_commit?我有一些解决方案,但有点困惑。我试过了:

  1. 在模型中使用after_commit :do_something, :on => :create
  2. 检查观察者中的created_atupdated_at;如果它们相同,那么它就是新记录。
  3. 使用user.new_record?
  4. 我很困惑,因为我想使用第三个,但它不起作用,我不知道为什么。我只想使用观察者,而不是模型。关于这个的任何想法?

3 个答案:

答案 0 :(得分:3)

答案 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_commitafter_destroy_commitafter_create_commit :do_something

在您自己的特殊情况下,您可以使用:

print("Foo",end=' ') print('Bar')