Using after_commit only on create

10,683

Solution 1

According to the docs using on: :create should work: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#method-i-after_commit

Solution 2

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.

Solution 3

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
Share:
10,683

Related videos on Youtube

Milind
Author by

Milind

I LOVE REACT,ANGULAR, NODEJS BUT THERE IS SOMETHING ABOUT RAILS THAT ATTRACTS ME MORE THAN ANYONE :) Thats what i Love about Rails...

Updated on June 04, 2022

Comments

  • Milind
    Milind almost 2 years

    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:

    1. Using after_commit :do_something, :on => :create in the model.
    2. Checking the created_at and updated_at in the observer; if they're the same, then it's a new record.
    3. Using 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?

    • DiegoSalazar
      DiegoSalazar over 9 years
      The 3rd one is not working because in after_commit it wouldn't be a new_record anymore.
  • Milind
    Milind over 9 years
    thanks @diego.greyrobot I dont want to use it in Model..how can i use it in observer only