คุณจะลบวัตถุ ActiveRecord ได้อย่างไร
ฉันดูActive Record Queryingและไม่มีอะไรในการลบที่ฉันเห็น
ลบโดย
id
,ลบวัตถุปัจจุบันเช่น:
user.remove
,คุณสามารถลบตาม
where
คำสั่งได้หรือไม่?
คุณจะลบวัตถุ ActiveRecord ได้อย่างไร
ฉันดูActive Record Queryingและไม่มีอะไรในการลบที่ฉันเห็น
ลบโดยid
,
ลบวัตถุปัจจุบันเช่น: user.remove
,
คุณสามารถลบตามwhere
คำสั่งได้หรือไม่?
คำตอบ:
มัน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
User.find_by(username:"bob")
เป็นการดีที่จะระบุระเบียนที่จะทำลายหรือลบเช่นกัน
นอกจากนี้delete
, delete_all
, และ destroy
destroy_all
เอกสาร ได้แก่ : เอกสารเก่าและRails 3.0.0 เอกสาร
delete
ไม่สร้างวัตถุในขณะที่destroy
ทำ โดยทั่วไปจะเร็วกว่าdelete
destroy
delete
เร็วขึ้น แต่ข้ามการโทรกลับที่คุณอาจระบุไว้ในรุ่น
User.destroy
User.destroy(1)
จะลบผู้ใช้ด้วยid == 1
และ:before_destroy
และการ:after_destroy
เรียกกลับเกิดขึ้น ตัวอย่างเช่นถ้าคุณมีบันทึกที่เกี่ยวข้อง
has_many :addresses, :dependent => :destroy
หลังจากผู้ใช้ถูกทำลายที่อยู่ของเขาก็จะถูกทำลายเช่นกัน หากคุณใช้การดำเนินการลบแทนการโทรกลับจะไม่เกิดขึ้น
User.destroy
, User.delete
User.destroy_all(<conditions>)
หรือ User.delete_all(<conditions>)
ประกาศ : ผู้ใช้เป็นคลาสและผู้ใช้เป็นวัตถุตัวอย่าง
User.destroy_all()
เรียกใช้การเรียกกลับดังนั้นก่อนที่จะลบอะไรก็โหลดบันทึก มันเป็นคำสั่ง SQL สองคำไม่ใช่หนึ่งคำ นอกเหนือจากความหมายของประสิทธิภาพการทำงานแล้วยังมีความเกี่ยวข้องกันพร้อมกัน การโทรที่ปลอดภัยจะข้ามการโทรกลับ User.delete_all()
จะออกเพียงDELETE FROM...
คำสั่งเดียว