ฉันจะลบระเบียนทั้งหมดในตารางฐานข้อมูลของฉันในแอป Ruby on Rails ได้อย่างไร
ฉันจะลบระเบียนทั้งหมดในตารางฐานข้อมูลของฉันในแอป Ruby on Rails ได้อย่างไร
คำตอบ:
หากคุณกำลังมองหาวิธีการโดยไม่มี SQL คุณควรจะสามารถใช้ delete_all ได้
Post.delete_all
หรือด้วยเกณฑ์
Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"
ดูที่นี่สำหรับข้อมูลเพิ่มเติม
บันทึกจะถูกลบโดยไม่ต้องโหลดก่อนซึ่งทำให้เร็วมาก แต่จะทำลายฟังก์ชันการทำงานเช่นแคชตัวนับซึ่งขึ้นอยู่กับรหัสรางที่จะดำเนินการเมื่อลบ
ActiveRecord
แบบจำลอง คำถามถามเกี่ยวกับการลบบันทึกจาก 'ตาราง' และฉันแค่ชี้หรือสมมติฐานที่อยู่ในคำตอบ
เพื่อลบผ่าน SQL
Item.delete_all # accepts optional conditions
ในการลบโดยเรียกเมธอดการทำลายของแต่ละรุ่น (มีราคาแพง แต่เรียกการเรียกกลับ)
Item.destroy_all # accepts optional conditions
ทั้งหมดที่นี่
หากคุณต้องการล้างฐานข้อมูลทั้งหมดและไม่เพียง แต่ลบโมเดลหรือโมเดลที่แนบมาเท่านั้นคุณสามารถทำได้:
rake db:purge
คุณสามารถทำได้บนฐานข้อมูลทดสอบ
rake db:test:purge
ถ้าคุณหมายถึงลบทุกอินสแตนซ์ของทุกรุ่นฉันจะใช้
ActiveRecord::Base.connection.tables.map(&:classify)
.map{|name| name.constantize if Object.const_defined?(name)}
.compact.each(&:delete_all)
select
เมื่อใดก็ตามที่คุณต้องการใช้นิพจน์ if ภายในบล็อกวิธีนี้จะช่วยให้คุณไม่ต้องเชื่อมโยงวิธีการกระชับเพื่อลบองค์ประกอบศูนย์
BlogPost.find_each(&:destroy)
หากโมเดลของคุณเรียกว่า BlogPost มันจะเป็น:
BlogPost.all.map(&:destroy)
MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
คำตอบล่าสุดในกรณีที่คุณต้องการลบทุกรายการในทุกตาราง:
def reset
Rails.application.eager_load!
ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration }
end
ข้อมูลเพิ่มเติมเกี่ยวกับที่นี่eager_load
หลังจากเรียกมันแล้วเราสามารถเข้าถึงผู้สืบทอดทั้งหมดActiveRecord::Base
และเราสามารถใช้ a delete_all
กับทุกรุ่นได้
โปรดทราบว่าเราไม่ได้ล้างตาราง SchemaMigration