Reputation: 7227
I was wondering in what order are callbacks and validations called when an ActiveRecord object is created.
Let’s say I have some custom validations & callbacks like the following:
validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference
which one will run first? The callback needs to happen first or else the validation may fail.
Upvotes: 61
Views: 42651
Reputation: 934
In addition to knowing the order in which each type of callback is called relative to the others, it's also important to be aware of the execution order of multiple callbacks of the same type. before_*
hooks are executed in the order in which you define them, but after_*
hooks are executed in reverse order. This can be surprising if you don't know it.
Upvotes: 0
Reputation: 81
Here is a list with all the available Active Record callbacks, listed in the same order in which they will get called during the respective operations:
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback
before_destroy
around_destroy
after_destroy
after_commit/after_rollback
after_save
runs both on create and update, but always after the more specific callbacks after_create
and after_update
, no matter the order in which the macro calls were executed.
before_destroy
callbacks should be placed before dependent: :destroy
associations (or use the prepend: true option), to ensure they execute before the records are deleted by dependent: :destroy
.
Upvotes: 6
Reputation: 11580
The most-up-to-date version of this list for the latest version of Rails can be found in the ActiveRecord::Callbacks
documentation. The lists for Rails 4, 3 & 2 are below.
The most up-to-date version of this list can be found in the Rails 4 Guides.
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback
before_destroy
around_destroy
after_destroy
after_commit/after_rollback
The most up-to-date version of this list can be found in the Rails 3 Guides.
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
before_destroy
around_destroy
after_destroy
The most up-to-date version of this list can be found in the Rails 2.3 Guides
before_validation
before_validation_on_create
after_validation
after_validation_on_create
before_save
before_create
INSERT
operationafter_create
after_save
before_validation
before_validation_on_update
after_validation
after_validation_on_update
before_save
before_update
UPDATE
operationafter_update
after_save
before_destroy
DELETE
operationafter_destroy
Since you need to first validate the reference_code
, the assign_reference
method can be called in the after_validation
callback or any callback appearing after it in the list I provided above.
Upvotes: 136