Prevent infinite loop when updating attributes within after_commit, :on => :create

activerecord, callback, ruby-on-rails, ruby-on-rails-4

Solution

You can use the method `update_column` that will skip all callbacks of your model:

self.update_column(:filename, filename)

Or you could use the method `update_all`, wich follows the same behavior

self.class.where('id = ?', self.id).update_all(:filename => filename)

And last but not least, my personal favorite:

self.filename = filename
self.send(:update_without_callbacks)

This one makes it pretty clear that all callbacks are been ignored, what is very helpful

Also, as a different alternative, you coud use `after_create` instead of `after_commit` if you want to run the `generate` method only when a new record is saved

Problem

I create an infinite callback loop when I need to update an attribute during an `after_commit, :on => :create`. It only occurs if I need to update an attribute of the object during this callback, though. Is there a way to prevent this? Can I somehow force a model to reload itself so it knows that it is performing an update rather than a create? ``` class Doc < ActiveRecord::Base after_commit :generate, :on => :create ... def generate # some logic here that requires this model to be saved in the db self.update_attributes(:filename => filename) # Infinite loop begins here. end end ```

Original source