Bagaimana Anda menghapus objek ActiveRecord?


328

Bagaimana Anda menghapus objek ActiveRecord?

Saya melihat Querying Rekaman Aktif dan tidak ada yang bisa dihapus yang bisa saya lihat.

  1. Hapus oleh id,

  2. Menghapus objek saat ini seperti: user.remove,

  3. Bisakah Anda menghapus berdasarkan whereklausa?

Jawaban:


572

Ini destroydan destroy_allmetode, seperti

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

Atau Anda dapat menggunakan deletedan delete_allyang tidak akan memberlakukan :before_destroydan :after_destroypanggilan balik atau opsi asosiasi yang tergantung.

User.delete_all(condition: 'value') akan memungkinkan Anda untuk menghapus catatan tanpa kunci utama

Catatan : dari komentar @ hammady, user.destroytidak akan berfungsi jika Model pengguna tidak memiliki kunci utama.

Catatan 2 : Dari komentar @ pavel-chuchuva, destroy_alldengan kondisi dan delete_allkondisi telah usang dalam Rails 5.1 - lihat panduan.rubyonrails.org/5_1_release_notes.html


4
Alangkah baiknya jika Anda bisa memasukkan komentar @ hammady dalam jawaban Anda. Berjuang untuk mencari tahu mengapa saya tidak bisa menghancurkan objek model saya ...
the_critic


Mengapa hanya memperbarui data kolom yang dihapus di database saya? Bagaimana saya bisa menghapus seluruh baris data?
TommyQu

1
destroy_all dengan ketentuan dan delete_all dengan ketentuan telah ditinggalkan dalam Rails 5.1 - lihat panduan.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva

ini User.find_by(username:"bob") bagus untuk mengidentifikasi catatan untuk dihancurkan atau dihapus juga.
barlop

60

Ada delete, delete_all, destroy, dan destroy_all.

Dokumen tersebut adalah: dokumen lama dan dokumen Rails 3.0.0

deletetidak instantiate objek, sementara destroytidak. Secara umum, deletelebih cepat dari destroy.


4
deletelebih cepat tetapi melewati callback yang mungkin Anda tetapkan pada model
Rudi

48
  1. User.destroy

User.destroy(1)akan menghapus pengguna dengan id == 1dan :before_destroydan :after_destroypanggilan balik terjadi. Misalnya jika Anda memiliki catatan terkait

has_many :addresses, :dependent => :destroy

Setelah pengguna dihancurkan, alamatnya akan dihancurkan juga. Jika Anda menggunakan tindakan hapus sebagai gantinya, panggilan balik tidak akan terjadi.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) atau User.delete_all(<conditions>)

Perhatikan : Pengguna adalah kelas dan pengguna adalah objek contoh


3
Terima kasih telah menangani catatan terkait.
Sage Mitchell

2
WASPADALAH: User.destroy_all()menjalankan panggilan balik, jadi sebelum menghapus apa pun, ia memuat catatan. Ini dua pernyataan SQL, bukan satu. Selain implikasi kinerja, ini juga memiliki implikasi konkurensi. Panggilan yang lebih aman akan melewatkan panggilan balik; User.delete_all()akan mengeluarkan hanya satu DELETE FROM...perintah.
Andrew Hodgkinson

1
destroy_all dengan ketentuan telah ditinggalkan dalam Rails 5.1 - lihat pedoman.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.