ActiveRecordオブジェクトが作成されたときにコールバックと検証が呼び出される順序は疑問に思っていました。
次のようなカスタム検証コールバックがあるとします。
validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference
どちらが最初に実行されますか?最初にコールバックを行う必要があります。そうしないと、検証が失敗する可能性があります。
Railsの最新バージョンのこのリストの最新バージョンは ActiveRecord::Callbacks
documentation にあります。=のリストRails 4、3 2は以下です。
このリストの最新バージョンは Rails 4ガイド にあります。
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
このリストの最新バージョンは Rails 3ガイド にあります。
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
このリストの最新バージョンは Rails 2.3ガイド にあります。
before_validation
before_validation_on_create
after_validation
after_validation_on_create
before_save
before_create
INSERT
操作after_create
after_save
before_validation
before_validation_on_update
after_validation
after_validation_on_update
before_save
before_update
UPDATE
操作after_update
after_save
before_destroy
DELETE
operationafter_destroy
最初にreference_code
を検証する必要があるため、assign_reference
メソッドは、after_validation
コールバックまたは上記のリストでその後に表示されるコールバックで呼び出すことができます。
利用可能なすべてのアクティブレコードコールバックのリスト があり、それぞれの操作中に呼び出されるのと同じ順序でリストされています。
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
は、作成時と更新時の両方で実行されますが、マクロ呼び出しが実行された順序に関係なく、より具体的なコールバックafter_create
およびafter_update
の後に常に実行されます。
before_destroy
コールバックは、dependent: :destroy
アソシエーションの前に配置する(または、prepend:trueオプションを使用する)ことで、dependent: :destroy
によってレコードが削除される前に実行されるようにする必要があります。