คุณจะลบวัตถุ ActiveRecord ได้อย่างไร


328

คุณจะลบวัตถุ ActiveRecord ได้อย่างไร

ฉันดูActive Record Queryingและไม่มีอะไรในการลบที่ฉันเห็น

  1. ลบโดยid,

  2. ลบวัตถุปัจจุบันเช่น: user.remove,

  3. คุณสามารถลบตามwhereคำสั่งได้หรือไม่?

คำตอบ:


572

มันdestroyและdestroy_allวิธีการเช่น

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

หรือคุณสามารถใช้deleteและdelete_allสิ่งใดที่จะไม่บังคับใช้:before_destroyและ:after_destroyโทรกลับหรือตัวเลือกการเชื่อมโยงใด ๆ ที่เกี่ยวข้อง

User.delete_all(condition: 'value') จะช่วยให้คุณสามารถลบบันทึกโดยไม่มีคีย์หลัก

หมายเหตุ : จากความคิดเห็นของ @ hammady user.destroyจะไม่ทำงานหากรุ่นผู้ใช้ไม่มีคีย์หลัก

หมายเหตุ 2 : จากความคิดเห็นของ @ pavel-chuchuva ที่destroy_allมีเงื่อนไขและdelete_allเงื่อนไขถูกเลิกใช้ใน Rails 5.1 - ดูคำแนะนำได้ที่ rubyonrails.org/5_1_release_notes.html


4
คงจะดีถ้าคุณใส่ความคิดเห็นของ @ hammady ไว้ในคำตอบของคุณ พยายามหาเหตุผลว่าทำไมฉันจึงไม่สามารถทำลายแบบจำลองวัตถุของฉัน ...
the_critic


เหตุใดจึงอัปเดตข้อมูลคอลัมน์ delete_at ในฐานข้อมูลของฉันเท่านั้น ฉันจะลบข้อมูลทั้งแถวได้อย่างไร
TommyQu

1
destroy_all พร้อมเงื่อนไขและ delete_all พร้อมเงื่อนไขเลิกใช้งานแล้วใน Rails 5.1 - ดูคำแนะนำ rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva

นี่User.find_by(username:"bob") เป็นการดีที่จะระบุระเบียนที่จะทำลายหรือลบเช่นกัน
barlop

60

นอกจากนี้delete, delete_all, และ destroydestroy_all

เอกสาร ได้แก่ : เอกสารเก่าและRails 3.0.0 เอกสาร

deleteไม่สร้างวัตถุในขณะที่destroyทำ โดยทั่วไปจะเร็วกว่าdeletedestroy


4
deleteเร็วขึ้น แต่ข้ามการโทรกลับที่คุณอาจระบุไว้ในรุ่น
Rudi

48
  1. User.destroy

User.destroy(1)จะลบผู้ใช้ด้วยid == 1และ:before_destroyและการ:after_destroyเรียกกลับเกิดขึ้น ตัวอย่างเช่นถ้าคุณมีบันทึกที่เกี่ยวข้อง

has_many :addresses, :dependent => :destroy

หลังจากผู้ใช้ถูกทำลายที่อยู่ของเขาก็จะถูกทำลายเช่นกัน หากคุณใช้การดำเนินการลบแทนการโทรกลับจะไม่เกิดขึ้น

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) หรือ User.delete_all(<conditions>)

ประกาศ : ผู้ใช้เป็นคลาสและผู้ใช้เป็นวัตถุตัวอย่าง


3
ขอขอบคุณที่จัดการกับระเบียนที่เกี่ยวข้อง
เซจมิทเชล

2
ระวัง: User.destroy_all()เรียกใช้การเรียกกลับดังนั้นก่อนที่จะลบอะไรก็โหลดบันทึก มันเป็นคำสั่ง SQL สองคำไม่ใช่หนึ่งคำ นอกเหนือจากความหมายของประสิทธิภาพการทำงานแล้วยังมีความเกี่ยวข้องกันพร้อมกัน การโทรที่ปลอดภัยจะข้ามการโทรกลับ User.delete_all()จะออกเพียงDELETE FROM...คำสั่งเดียว
Andrew Hodgkinson

1
destroy_all พร้อมเงื่อนไขถูกคัดค้านใน Rails 5.1 - ดูคำแนะนำ rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.