57

ActiveRecordオブジェクトが作成されるときに呼び出されるコールバックと検証はどのような順序であるのか疑問に思いました。

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

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

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

4

2 に答える 2

132

Railsの最新バージョンに関するこのリストの最新バージョンは、ActiveRecord::Callbacksドキュメントに記載されています。Rails 4、3、2のリストは以下のとおりです。

Rails 4

このリストの最新バージョンは、Rails4Guidesにあります。

オブジェクトの作成

  • 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

このリストの最新バージョンは、Rails3ガイドにあります。

オブジェクトの作成

  • 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

レール2

このリストの最新バージョンは、Rails2.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手術
  • after_destroy

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

于 2012-06-13T18:35:59.387 に答える
4

Rails 5

これは、利用可能なすべてのActive Recordコールバックのリストであり、それぞれの操作中に呼び出されるのと同じ順序でリストされています。

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

于 2019-03-21T06:30:05.120 に答える