web-dev-qa-db-ja.com

ActiveRecordのコールバックと検証の順序は何ですか?

ActiveRecordオブジェクトが作成されたときにコールバックと検証が呼び出される順序は疑問に思っていました。

次のようなカスタム検証コールバックがあるとします。

validates :reference_code, :if => :reference_code, :on => :create
before_create :assign_reference

どちらが最初に実行されますか?最初にコールバックを行う必要があります。そうしないと、検証が失敗する可能性があります。

50
Abid

Railsの最新バージョンのこのリストの最新バージョンは ActiveRecord::Callbacks documentation にあります。=のリストRails 4、3 2は以下です。

Rails 4

このリストの最新バージョンは 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

このリストの最新バージョンは 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

このリストの最新バージョンは 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 operation
  • after_destroy

最初にreference_codeを検証する必要があるため、assign_referenceメソッドは、after_validationコールバックまたは上記のリストでその後に表示されるコールバックで呼び出すことができます。

120
Bart Jedrocha

Rails 5

利用可能なすべてのアクティブレコードコールバックのリスト があり、それぞれの操作中に呼び出されるのと同じ順序でリストされています。

1オブジェクトの作成

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_create
  • around_create
  • after_create
  • after_save
  • after_commit/after_rollback

2オブジェクトの更新

  • before_validation
  • after_validation
  • before_save
  • around_save
  • before_update
  • around_update
  • after_update
  • after_save
  • after_commit/after_rollback

3オブジェクトの破棄

  • before_destroy
  • around_destroy
  • after_destroy
  • after_commit/after_rollback

after_saveは、作成時と更新時の両方で実行されますが、マクロ呼び出しが実行された順序に関係なく、より具体的なコールバックafter_createおよびafter_updateの後に常に実行されます。

before_destroyコールバックは、dependent: :destroyアソシエーションの前に配置する(または、prepend:trueオプションを使用する)ことで、dependent: :destroyによってレコードが削除される前に実行されるようにする必要があります。

0
Deepsystm