อะไรคือความแตกต่างระหว่าง "after_create" และ "after_save" และเมื่อใดควรใช้


124

มีafter_createและafter_saveเช่นเดียวกับการทำงานต่อ?

ฉันต้องการดำเนินการกับอีเมลของผู้ใช้หลังจากสร้างบัญชีแล้ว

ฉันต้องการดำเนินการดังกล่าวเมื่อบันทึกไว้ในฐานข้อมูล

ที่นิยมใช้: after_createหรือafter_save?

คำตอบ:


212

after_create ใช้งานได้เพียงครั้งเดียว - หลังจากสร้างเรกคอร์ดครั้งแรก

after_save ทำงานทุกครั้งที่คุณบันทึกวัตถุแม้ว่าคุณจะเพิ่งอัปเดตในอีกหลายปีต่อมา

ดังนั้นถ้าคุณต้องการที่จะดำเนินการในอีเมลฉบับนี้เพียงครั้งเดียว (แล้วไม่เคยอีกครั้ง) after_createจากนั้นใช้

ถ้าคุณต้องการทำทุกครั้งที่บันทึกวัตถุให้ทำในafter_save


2
ผู้อ่านควรทราบว่าตามเอกสาร ActiveRecord update_allไม่เรียกใช้การโทรกลับใด ๆ รวมถึงafter_*
user2426679

93

จากเอกสาร :

after_create()

ถูกเรียกตาม Base.saveอ็อบเจ็กต์ใหม่ที่ยังไม่ได้บันทึก (ไม่มีบันทึก)

after_save()

ถูกเรียกหลังจากBase.save (ไม่ว่าจะสร้างหรืออัปเดตบันทึก)


1
after_save()

ใช้งานได้ดีเมื่อคุณต้องบันทึกโมเดลที่ไม่ได้บันทึกบ่อยนัก สำหรับตัวอย่างเฉพาะของการเปลี่ยนแปลงบันทึกบ่อยๆขอแนะนำให้ใช้

 after_commit()

ตรวจสอบให้แน่ใจว่าโมเดลถูกบันทึกไว้ในฐานข้อมูลก่อนที่จะดำเนินการดำเนินการ after_commit: คำนวณ_credit_score

def calculate_credit_score
     #Call a Cron job
end

คุณแนะนำให้ใช้after_commitแต่ไม่อธิบายว่าทำไม ช่วยอธิบายให้ละเอียดหน่อยได้ไหม? โปรดทราบว่าafter_commitทำงานในการสร้างอัปเดตและทำลาย Docs: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/…ดังนั้นจึงไม่เป็นพฤติกรรมเดียวกันกับที่after_saveคุณต้องการเรียก cron_job หลังจากทำลายบันทึกหรือไม่? หรือในกรณีการดำเนินการส่งอีเมลไปยังผู้ใช้ที่ถูกลบไปแล้ว? ระวังการใช้after_commit
rmcsharry

after_commitทำงานบนการดำเนินการ CRUD เหล่านั้นดังนั้นหากในกรณีของเขาอีเมลได้รับการอัปเดตบ่อยครั้งการรวมการดำเนินการสำหรับการโทรกลับเฉพาะจะง่ายกว่า ในกรณีของฉันฉันใช้after_commit : calculate_profile_update, on: :update
pensebien
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.