Ruby on Railsコールバック、:before_saveと:before_createの違いは何ですか?


184

:before_saveおよび:before_createRuby on Railsのコールバックとは何か、そしてそれらはRailsの検証とどのように関係しているのか、詳しく説明していただけますか?検証は後に発生してい:before_saveたり:before_create

回答:


363

Railsでのcreateオペレーションでは、データベースオペレーションの前に6つのコールバックがあり、2つ後にコールバックがあります。順に、次のとおりです。

  1. before_validation
  2. before_validation_on_create
  3. after_validation
  4. after_validation_on_create
  5. before_save
  6. before_create

    データベース挿入
  7. after_create
  8. after_save

更新操作のセットはまったく同じですが、すべてupdatecreate場所ではなく読み取られます(およびINSERTではなくUPDATE)。

これから、before_saveおよびbefore_createコールバックの前に検証が実行されていることがわかります。

before_save少し前に起こりますbefore_create。私の知る限り、それらの間では何も起こりません。ただしbefore_save、Updateオペレーションでも発生しますが、before_createCreatesでのみ発生します。


27
before_validation_on_createおよびafter_validation_on_createはRails 3から削除されました。代わりにbefore_validationおよびafter_validationオプションを使用してください:on => :create

after_saveまたはを使用したときに作成されたばかりのレコードをどのように参照しますかafter_create
bcackerman 2013年

@bcackerman- after_saveまたはafter_createコールバックでselfは、保存後に存在するため、保存されたばかりのレコードです。それはのような自動生成のフィールドが含まれidcreated_atupdated_at
Chowlett 2013

またbefore_createcreate呼び出される実際のメソッドではなく、データベースに保存される新しいオブジェクトを指すことを忘れないでください。したがって、メソッドbefore_createからでもまだ発生できsaveます。
Steve

1
@ラズ-ええ、いいえ?ドキュメントにはまだbefore_save3番目とbefore_create5番目がリストされています。
Chowlett

136

before_saveオブジェクトが保存されるたびに呼び出されます。新しいオブジェクトと既存のオブジェクトについてです。(作成および更新アクション)

before_create作成前のみ。新しいオブジェクトのみ(アクションを作成)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.