「after_create」と「after_save」の違いは何ですか、いつ使用するのですか?


124

あるafter_createafter_save機能ごとのと同じ?

アカウント作成後にユーザーのメールで操作したい。

データベースに保存した時にその操作をしたいのですが。

どちらを使用することが望ましい: after_createまたはafter_save

回答:


212

after_create レコードが最初に作成された直後-一度だけ機能します。

after_save オブジェクトを保存するたびに機能します-何年も後に更新しているだけでも

したがって、この電子メール操作を1度だけ実行したい場合(その後は2度実行しない場合)は、を使用しますafter_create

オブジェクトが保存されるたびに実行したい場合は、after_save


2
読者は、ドキュメントよれば、ActiveRecord update_allはコールバックをafter_*
呼び出さ

93

ドキュメントから:

after_create()

Base.saveまだ保存されていない(レコードが存在しない)新しいオブジェクトに対して呼び出さ れます。

after_save()

Base.save (作成または更新の保存に関係なく)後に呼び出されます。


1
after_save()

頻繁に保​​存しないモデルを保存する必要がある場合に問題なく機能します。頻繁にレコードを変更するこの特定の例では、以下を使用することをお勧めします

 after_commit()

アクションが実行される前にモデルがデータベースに保存されていることを確認して くださいafter_commit:calculate_credit_score

def calculate_credit_score
     #Call a Cron job
end

使用することをお勧めしますafter_commitが、理由は説明しません。詳しく説明してもらえますか?after_commitcreate、updat、destroy で実行されることに注意してください。ドキュメント:apidock.com/rails/ActiveRecord/Transactions/ClassMethods/…したがってafter_save、レコードを破棄した後でcron_jobを実際に呼び出したいのと同じ動作ではありませんか?または、opsの場合、削除されたユーザーにメールを送信しますか?使用には注意してくださいafter_commit
rmcsharry

after_commitそれらのCRUD操作で実行されるため、彼の場合に電子メールが頻繁に更新される場合は、特定のコールバックのアクションを組み合わせる方が簡単です。私の場合、使用しましたafter_commit : calculate_profile_update, on: :update
ペンセビアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.