Menghapus semua catatan dalam tabel database

Jawaban:

249

Jika Anda mencari cara untuk melakukannya tanpa SQL Anda harus dapat menggunakan delete_all.

Post.delete_all

atau dengan kriteria

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

Lihat di sini untuk informasi lebih lanjut.

Catatan dihapus tanpa memuatnya terlebih dahulu yang membuatnya sangat cepat tetapi akan merusak fungsionalitas seperti penghitung cache yang tergantung pada kode rel yang akan dieksekusi pada penghapusan.

HakonB
sumber
13
Perlu dicatat bahwa jika Anda memiliki asosiasi dengan: depend =>: destroy, atau apa pun yang perlu dibersihkan setelah dihapus, Anda mungkin ingin Post.destroy_all - meskipun jauh lebih lambat. Lihat apidock.com/rails/ActiveRecord/Base/destroy_all/class
Michael Hellein
Jawaban ini mengasumsikan bahwa tabel memiliki model yang terkait dengannya. OP tidak menentukan ini - bagaimana jika tabelnya adalah tabel bergabung?
Toby 1 Kenobi
1
@BradWerth apakah itu dianggap oleh beberapa orang sebagai gaya yang baik atau buruk, saya hanya mengatakan itu layak bahwa Rails db memiliki tabel yang bukan ActiveRecordmodel. Pertanyaannya bertanya tentang menghapus catatan dari 'tabel' dan saya hanya menunjuk atau asumsi yang ada dalam jawaban.
Toby 1 Kenobi
Saya memiliki pertanyaan yang sama dengan @ Toby1Kenobi.
nbsamar
30

Untuk menghapus melalui SQL

Item.delete_all # accepts optional conditions

Untuk menghapus dengan memanggil metode penghancuran setiap model (mahal tetapi memastikan panggilan balik dipanggil)

Item.destroy_all # accepts optional conditions

Semua disini

lebreeze
sumber
21

jika Anda ingin mengosongkan basis data dan tidak hanya menghapus model atau model yang terlampir, Anda dapat melakukannya:

rake db:purge

Anda juga dapat melakukannya di database pengujian

rake db:test:purge
KensoDev
sumber
5

Jika Anda bermaksud menghapus setiap instance dari semua model, saya akan menggunakan

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)
dfaulken
sumber
1
Lebih suka selectsetiap kali Anda perlu menggunakan ekspresi if di dalam blok, dengan cara ini Anda menghindari harus memadukan metode ringkas untuk menghapus elemen nil.
Sebastian Palma
4
BlogPost.find_each(&:destroy)
Philip
sumber
Ini bagus untuk kondisi memori rendah.
Epigene
Ini adalah satu-satunya jawaban yang memperhitungkan pemakaian memori.
John
2
Omg, mengapa harus membuat lingkaran untuk ini ... tidak masuk akal. hapus saja semua record DELETE FROM table, Model.delete_all
Imnl
@ John mengapa satu permintaan tunggal menghabiskan lebih banyak memori daripada satu lingkaran pertanyaan?
Imnl
@ Imnl Setiap iterasi membuat instance baru dari model yang bersangkutan sehingga dapat memproses panggilan balik untuk metode hapus.
John
2

Jika model Anda disebut BlogPost, itu akan menjadi:

BlogPost.all.map(&:destroy)
Stefan
sumber
ini akan mengambil setiap BlogPost tunggal dan memuatnya ke dalam array Ruby sebelum menghancurkannya.
hdgarrood
Tergantung pada ORM. Datamapper tidak akan melakukan itu karena Anda tidak meminta apa pun tentang masing-masing model. Dan inilah sebuah stacktrace Mongoid yang menunjukkan bahwa ia tidak memilih bidang apa pun sebelum menghancurkan setiap entri: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)
stef
4
karena ini pertanyaan rel, dan penanya belum mengatakan ORM mana yang dia gunakan, kita harus mengasumsikan ActiveRecord
hdgarrood
2

Jawaban yang lebih baru jika Anda ingin menghapus setiap entri di setiap tabel:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

Informasi lebih lanjut tentang di eager_load sini .

Setelah memanggilnya, kita dapat mengakses semua keturunan ActiveRecord::Basedan kita dapat menerapkan delete_allsemua model.

Perhatikan bahwa kami pastikan tidak menghapus tabel SchemaMigration.

Simon Ninon
sumber