Reputation: 5112
I have a UserObserver with after_commit
(changed from after_create
to avoid a race condition error that id not found) to update the count. But I know for every create, update is executing the after_commit
code (which I knew would happen). How can I run the after_commit
only on create? I have few solutions but a bit confused. I've tried:
after_commit :do_something, :on => :create
in the model.created_at
and updated_at
in the observer; if they're the same, then it's a new record.user.new_record?
I am confused as I want to use 3rd one, but it's not working and I don't know why. I want to use observers only and not the model. Any ideas on this?
Upvotes: 6
Views: 18050
Reputation: 4248
From rails 5, Rails added three new aliases to handle this kind of situation:
after_create_commit
, after_update_commit
, after_destroy_commit
In your own particular case, you can use:
after_create_commit :do_something
.
Upvotes: 16
Reputation: 3373
Just FYI the accepted answer does not work in many versions of rails and is a bug. This ticket is referencing a different issue of multiple callbacks with the same name. However, the bug is still there (any after_commit on:create doesn't work) in many rails versions.
'seako' has a workaround to fix this problem if you are running into it
https://github.com/rails/rails/issues/988
after_commit ->(obj) { obj.do_something }, on: :create
Upvotes: 2
Reputation: 13531
According to the docs using on: :create
should work: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#method-i-after_commit
Upvotes: 7