Ruby on Rails Callback ความแตกต่างระหว่าง: before_save และ: before_create คืออะไร


184

คุณช่วยอธิบายรายละเอียดเกี่ยวกับการเรียกกลับ:before_saveและ:before_createRuby on Rails ได้อย่างไรและพวกเขาต้องทำอย่างไรกับการตรวจสอบความถูกต้องของ Rails? การตรวจสอบเกิดขึ้นหลังจาก:before_saveหรือ:before_createไม่?

คำตอบ:


363

ในการดำเนินการสร้างภายใต้ Rails มีการเรียกกลับหกครั้งก่อนการดำเนินการฐานข้อมูลและสองครั้งหลังจากนั้น ตามลำดับเหล่านี้คือ:

  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

การดำเนินการอัปเดตมีชุดเดียวกันทั้งหมดยกเว้นอ่านupdateแทนcreateทุกที่ (และอัปเดตแทนINSERT )

จากนี้คุณจะเห็นว่าการตรวจสอบจะดำเนินการก่อนbefore_saveและการbefore_createเรียกกลับ

เกิดขึ้นเล็กน้อยก่อนbefore_save before_createเพื่อความรู้ของฉันที่ดีที่สุดไม่มีอะไรเกิดขึ้นระหว่างพวกเขา แต่before_saveจะเริ่มการอัปเดตในขณะที่before_createจะสร้างเฉพาะใน Creates


27
before_validation_on_createและafter_validation_on_createจะถูกลบออก ณ Rails 3แทนที่จะใช้before_validationและตามลำดับพร้อมกับตัวเลือกafter_validation :on => :create
อาทิตย์ที่

คุณจะอ้างถึงบันทึกที่เพิ่งสร้างเมื่อใช้after_saveหรือafter_createอย่างไร
bcackerman

@ bcackerman - ในafter_saveหรือafter_createโทรกลับselfเป็นบันทึกที่เพิ่งบันทึกตามที่มีอยู่หลังจากบันทึก ที่มีสาขา autogenerated ชอบid, ,created_at updated_at
Chowlett

โปรดจำไว้ว่าbefore_createหมายถึงวัตถุใหม่ที่ถูกบันทึกลงในฐานข้อมูลไม่ใช่createวิธีการจริงที่ถูกเรียก ดังนั้นbefore_createสามารถยิงได้แม้กระทั่งจากsaveวิธีการ
Steve

1
@ ถนน - เอ่อไม่เหรอ? เอกสารยังคงแสดงรายการbefore_saveที่ 3 และbefore_create5
Chowlett

136

before_saveถูกเรียกทุกครั้งที่วัตถุถูกบันทึก ดังนั้นสำหรับวัตถุใหม่และที่มีอยู่ (สร้างและอัปเดตการกระทำ)

before_createก่อนการสร้างเท่านั้น ดังนั้นสำหรับวัตถุใหม่เท่านั้น (สร้างการกระทำ)


3

before_create VS before_save :on => :create

บางครั้งคุณต้องระวังลำดับของการเรียกกลับ

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม: http://pivotallabs.com/activerecord-callbacks-autosave-before-this-and-that-etc/


5
before_save :on => :createไม่ทำงาน (อย่างน้อยบนราง 3.2)
cutalion

1
คุณสามารถใช้:before_save :generate_api_key, :if => :new_record?
Kasper Grubbe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.