ความแตกต่างระหว่าง. build, .create และ .create! และควรใช้เมื่อใด


167

ดังนั้นผมจึงได้รับการเห็นคนที่ใช้.build, .createและ.create!ภายในการควบคุมของพวกเขามากขึ้นและมากขึ้นเมื่อเร็ว ๆ นี้ อะไรคือความแตกต่างจากการใช้.newและการส่งผ่านวัตถุ param'd แล้ว.save? มีข้อดีข้อเสียหรือไม่? การใช้วิธีการอื่นเหล่านี้ให้ประโยชน์หรือไม่?

คำตอบ:


234

มีความแตกต่างกันเล็กน้อย แต่ก็ไม่ใหญ่:

  1. .createเทียบเท่ากับการตาม.new .saveมันรวบรัดมากขึ้น
  2. .create!เทียบเท่ากับ.newตามด้วย.save!(โยนข้อผิดพลาดหากการบันทึกล้มเหลว) มันสั้นกว่านิดหน่อย
  3. ผมคิดว่า.buildเป็นส่วนใหญ่.newนามแฝงสำหรับ ใช้งานได้หนึ่งเส้นทางใน Rails 3และอีกวิธีใน Rails <3.x

อย่างไรก็ตามส่วนที่สำคัญที่สุดคือวิธีการเหล่านี้สามารถเรียกผ่านการเชื่อมโยง ( has_manyฯลฯ ) เพื่อเชื่อมโยงทั้งสองรุ่นโดยอัตโนมัติ


1
ฉันเลือกอันนี้เป็นคำตอบที่ถูกต้องที่สุดเนื่องจากมีการกล่าวถึงความสามารถในการเชื่อมโยงโมเดลที่เกี่ยวข้องกับพวกเขา - นั่นเป็นข้อแตกต่างที่น่าสนใจและสำคัญที่ฉันคิดว่าใช้มากกว่า. new and .save ซึ่งใช้เวลาทำงานเพิ่มเล็กน้อย ขอบคุณ
Tim Knight

11
คำอธิบายรองลงมาในวันที่ 3 - สร้างทำมากกว่าเพียงแค่ใหม่ - มันยังตั้งลิงค์เชื่อมโยง
นักเลงสองบิต

116
สร้างแตกต่างจากใหม่ แต่ความแตกต่างไม่ใช่ว่ามันจะเชื่อมโยงการเชื่อมโยง (ใหม่ไม่เช่นกันสำหรับอินสแตนซ์ใหม่) ความแตกต่างคือ Build จะเติมผู้โทรด้วยอินสแตนซ์ใหม่ แต่ใหม่จะไม่ ตัวอย่างเช่น: Wall.posts.new จะให้โพสต์ใหม่ที่เชื่อมโยงกับ Wall ของคุณ แต่ Wall.posts ยังคงว่างเปล่าหลังจากการโทรนี้ Wall.posts.build ให้โพสต์ใหม่ที่เชื่อมโยงกับ Wall ของคุณและ Wall.posts ตอนนี้มีหนึ่งโพสต์
Amin Ariana

3
ตอนนี้มันไม่ใช่แค่นามแฝง แต่ไม่มีฟังก์ชั่นพิเศษใช่ไหม
Gabriele Cirulli

14
ใน Rails 4 ฉันเพิ่งตรวจสอบในคอนโซล wall.posts.new และ wall.posts.build มีทั้งการเติมวัตถุผนังในลักษณะเดียวกัน หมายถึงหลังจาก wall.posts.new, wall.posts ไม่ว่างเปล่าตามที่อ้างไว้ในความคิดเห็นของอามิน
ธ ปท

35

แม้ว่ามันจะถูกต้องที่createเรียกnewแล้วsaveมีความแตกต่างใหญ่ระหว่างสองทางเลือกในค่าตอบแทนของพวกเขา

Saveส่งคืนอย่างใดอย่างหนึ่งtrueหรือfalseขึ้นอยู่กับว่าวัตถุถูกบันทึกไปยังฐานข้อมูลเรียบร้อยแล้วหรือไม่ ซึ่งสามารถใช้สำหรับการควบคุมการไหลตามตัวอย่างแรกในคำถามข้างต้น

Createจะส่งคืนโมเดลโดยไม่คำนึงว่าวัตถุนั้นได้รับการบันทึกหรือไม่ สิ่งนี้มีความเกี่ยวข้องกับรหัสข้างต้นซึ่งสาขาด้านบนของifคำสั่งจะถูกดำเนินการเสมอแม้ว่าวัตถุจะล้มเหลวในการตรวจสอบและจะไม่ถูกบันทึก

ถ้าคุณใช้createกับการแยกทางตรรกะคุณมีความเสี่ยงของความล้มเหลวเงียบซึ่งเป็นกรณีที่ไม่ถ้าคุณใช้+newsave

create! ไม่ต้องทนทุกข์ทรมานจากปัญหาเดียวกันในขณะที่มันเพิ่มและยกเว้นหากบันทึกไม่ถูกต้อง

createทางเลือกที่สามารถเป็นประโยชน์ในการควบคุมที่respond_withจะใช้สำหรับ API (JSON / XML) การตอบสนอง ในกรณีนี้การมีอยู่ของข้อผิดพลาดบนวัตถุจะทำให้ข้อผิดพลาดถูกส่งกลับในการตอบสนองด้วยสถานะunprocessable_entityซึ่งเป็นสิ่งที่คุณต้องการจาก API

ฉันมักจะใช้ตัวเลือกnew+ saveสำหรับ html โดยเฉพาะถ้าคุณพึ่งพาค่าตอบแทนสำหรับการควบคุมการไหล


6

#create เป็นรุ่นใหม่ที่สั้นลงและบันทึก #สร้าง! กำลังโยนข้อยกเว้นหากการตรวจสอบไม่เป็นบวก


5

ฉันสองคำตอบข้างต้น Plus สำหรับcreateหนึ่งไม่สามารถส่งผ่านเป็นอาร์กิวเมนต์ซึ่งคุณสามารถทำอะไรกับfalse saveการผ่านfalseเป็นอาร์กิวเมนต์จะข้ามการตรวจสอบรางทั้งหมด

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