Apa perbedaan antara `after_create` dan` after_save` dan kapan harus menggunakan yang mana?

124

Apakah after_createdan after_savesama seperti per fungsionalitas?

Saya ingin melakukan operasi dengan email pengguna setelah pembuatan akunnya.

Saya ingin melakukan operasi itu ketika disimpan dalam database.

mana yang lebih disukai untuk digunakan: after_createatau after_save?

Swapnil Chincholkar
sumber

Jawaban:

212

after_create hanya berfungsi sekali - sesaat setelah catatan pertama kali dibuat.

after_save berfungsi setiap kali Anda menyimpan objek - bahkan jika Anda hanya memperbaruinya bertahun-tahun kemudian

Jadi jika Anda ingin melakukan operasi email ini hanya sekali saja (dan kemudian tidak pernah lagi) maka gunakan after_create.

Jika Anda ingin melakukannya setiap kali objek disimpan, maka lakukanlahafter_save

Taryn East
sumber
2
pembaca harus mencatat bahwa, menurut dokumen , ActiveRecord update_alltidak meminta panggilan balik apa pun, termasukafter_*
user2426679
93

Dari dokumen :

after_create()

Disebut setelah Base.savepada objek baru yang belum disimpan (tidak ada catatan).

after_save()

Disebut setelah Base.save (terlepas dari apakah itu membuat atau memperbarui menyimpan).

Michael Kohl
sumber
1
after_save()

Berfungsi dengan baik ketika Anda harus menyimpan model yang tidak terlalu sering disimpan. Untuk contoh khusus ini sering mengubah catatan akan disarankan untuk digunakan

 after_commit()

pastikan bahwa model disimpan dalam database sebelum tindakan dijalankan after_commit: calcul_credit_score

def calculate_credit_score
     #Call a Cron job
end
pensebien
sumber
Anda menyarankan untuk menggunakan after_committetapi tidak menjelaskan alasannya. Bisakah Anda jelaskan? Perhatikan bahwa after_commitberjalan pada buat, perbarui dan hancurkan. Documents: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/... Jadi bukan perilaku yang sama seperti after_saveAnda benar-benar ingin memanggil cron_job setelah setelah menghancurkan catatan? Atau dalam kasus ops, kirim email ke pengguna yang sekarang dihapus? Hati-hati menggunakanafter_commit
rmcsharry
after_commitberjalan pada operasi CRUD tersebut, jadi jika dalam kasusnya email sering diperbarui, maka akan lebih mudah untuk menggabungkan tindakan untuk panggilan balik tertentu. Dalam kasus saya, saya menggunakanafter_commit : calculate_profile_update, on: :update
pensebien