คุณช่วยอธิบายรายละเอียดเกี่ยวกับการเรียกกลับ:before_saveและ:before_createRuby on Rails ได้อย่างไรและพวกเขาต้องทำอย่างไรกับการตรวจสอบความถูกต้องของ Rails? การตรวจสอบเกิดขึ้นหลังจาก:before_saveหรือ:before_createไม่?
คุณช่วยอธิบายรายละเอียดเกี่ยวกับการเรียกกลับ:before_saveและ:before_createRuby on Rails ได้อย่างไรและพวกเขาต้องทำอย่างไรกับการตรวจสอบความถูกต้องของ Rails? การตรวจสอบเกิดขึ้นหลังจาก:before_saveหรือ:before_createไม่?
คำตอบ:
ในการดำเนินการสร้างภายใต้ Rails มีการเรียกกลับหกครั้งก่อนการดำเนินการฐานข้อมูลและสองครั้งหลังจากนั้น ตามลำดับเหล่านี้คือ:
before_validationbefore_validation_on_createafter_validationafter_validation_on_createbefore_savebefore_create
after_createafter_saveการดำเนินการอัปเดตมีชุดเดียวกันทั้งหมดยกเว้นอ่านupdateแทนcreateทุกที่ (และอัปเดตแทนINSERT )
จากนี้คุณจะเห็นว่าการตรวจสอบจะดำเนินการก่อนbefore_saveและการbefore_createเรียกกลับ
เกิดขึ้นเล็กน้อยก่อนbefore_save before_createเพื่อความรู้ของฉันที่ดีที่สุดไม่มีอะไรเกิดขึ้นระหว่างพวกเขา แต่before_saveจะเริ่มการอัปเดตในขณะที่before_createจะสร้างเฉพาะใน Creates
after_saveหรือafter_createอย่างไร
after_saveหรือafter_createโทรกลับselfเป็นบันทึกที่เพิ่งบันทึกตามที่มีอยู่หลังจากบันทึก ที่มีสาขา autogenerated ชอบid, ,created_at updated_at
before_createหมายถึงวัตถุใหม่ที่ถูกบันทึกลงในฐานข้อมูลไม่ใช่createวิธีการจริงที่ถูกเรียก ดังนั้นbefore_createสามารถยิงได้แม้กระทั่งจากsaveวิธีการ
before_saveที่ 3 และbefore_create5
before_saveถูกเรียกทุกครั้งที่วัตถุถูกบันทึก ดังนั้นสำหรับวัตถุใหม่และที่มีอยู่ (สร้างและอัปเดตการกระทำ)
before_createก่อนการสร้างเท่านั้น ดังนั้นสำหรับวัตถุใหม่เท่านั้น (สร้างการกระทำ)
before_create VS before_save :on => :create
บางครั้งคุณต้องระวังลำดับของการเรียกกลับ
ดูที่นี่สำหรับรายละเอียดเพิ่มเติม:
http://pivotallabs.com/activerecord-callbacks-autosave-before-this-and-that-etc/
before_save :on => :createไม่ทำงาน (อย่างน้อยบนราง 3.2)
before_save :generate_api_key, :if => :new_record?
before_validation_on_createและafter_validation_on_createจะถูกลบออก ณ Rails 3แทนที่จะใช้before_validationและตามลำดับพร้อมกับตัวเลือกafter_validation:on => :create