Apa perbedaan antara
@model.destroy
dan @model.delete
Sebagai contoh:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Apakah penting jika saya menggunakan yang satu atau yang lain?
sumber
Apa perbedaan antara
@model.destroy
dan @model.delete
Sebagai contoh:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Apakah penting jika saya menggunakan yang satu atau yang lain?
Pada dasarnya destroy
menjalankan semua callback pada model sementara delete
tidak.
Dari API Rails :
ActiveRecord::Persistence.delete
Menghapus catatan dalam database dan membekukan instance ini untuk mencerminkan bahwa tidak ada perubahan yang harus dilakukan (karena tidak dapat dipertahankan). Mengembalikan contoh beku.
Baris hanya dihapus dengan pernyataan SQL DELETE pada kunci utama catatan, dan tidak ada panggilan balik yang dijalankan.
Untuk menegakkan callback sebelum_destroy dan after_destroy objek atau apa pun: opsi asosiasi yang bergantung, gunakan #destroy.
ActiveRecord::Persistence.destroy
Menghapus catatan dalam database dan membekukan instance ini untuk mencerminkan bahwa tidak ada perubahan yang harus dilakukan (karena tidak dapat dipertahankan).
Ada serangkaian panggilan balik yang terkait dengan penghancuran. Jika panggilan balik before_destroy kembali palsu tindakan dibatalkan dan menghancurkan kembali palsu. Lihat ActiveRecord :: Callbacks untuk detail lebih lanjut.
model#before_destroy
yang dapat digunakan untuk menghentikandestroy()
panggilan terakhir dalam kondisi tertentu.delete
hanya akan menghapus catatan objek saat ini dari db tetapi tidak terkait dengan catatan anak-anak dari db.destroy
akan menghapus catatan objek saat ini dari db dan juga catatan anak-anak terkait dari db.Penggunaannya sangat penting:
Jika beberapa objek orang tua Anda membagikan objek anak-anak biasa, maka memanggil
destroy
objek induk tertentu akan menghapus objek anak-anak yang dibagikan di antara banyak orang tua lainnya.sumber
destroy
adalah keturunan , bukan anak - anak : menurut dokumentasi, menghancurkan "menciptakan objek baru dari atribut, dan kemudian memanggil menghancurkan di atasnya." rubydoc.info/docs/rails/4.1.7/ActiveRecord%2Felation:destroyKetika Anda memohon
destroy
ataudestroy_all
pada suatuActiveRecord
objek, prosesActiveRecord
'penghancuran' dimulai, ia menganalisis kelas yang Anda hapus, itu menentukan apa yang harus dilakukan untuk dependensi, dijalankan melalui validasi, dll.Ketika Anda memohon
delete
ataudelete_all
pada suatu objek,ActiveRecord
hanya mencoba menjalankanDELETE FROM tablename WHERE conditions
kueri terhadap db, tidak melakukanActiveRecord
tugas tingkat- lain .sumber
Ya ada perbedaan besar antara kedua metode. Gunakan delete_all jika Anda ingin catatan dihapus dengan cepat tanpa model panggilan balik dipanggil
Jika Anda peduli dengan model Anda, callback kemudian gunakan destroy_all
Dari dokumen resmi
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
sumber
Pada dasarnya "delete" mengirimkan permintaan langsung ke database untuk menghapus catatan. Dalam hal itu Rails tidak tahu atribut apa yang ada dalam catatan itu dihapus atau apakah ada panggilan balik (seperti
before_destroy
).Metode "hancurkan" mengambil id yang lewat, mengambil model dari database menggunakan metode "temukan", kemudian panggilan hancurkan pada itu. Ini berarti callback terpicu.
Anda ingin menggunakan "hapus" jika Anda tidak ingin callback terpicu atau Anda menginginkan kinerja yang lebih baik. Kalau tidak (dan sebagian besar waktu) Anda akan ingin menggunakan "menghancurkan".
sumber
Sudah banyak jawaban; ingin melompat dengan sedikit lebih banyak.
dokumen :
The
delete
verbage bekerja secara berbeda untukActiveRecord::Association.has_many
danActiveRecord::Base
. Untuk yang terakhir, hapus akan mengeksekusiSQL DELETE
dan memotong semua validasi / panggilan balik. Yang pertama akan dieksekusi berdasarkan:dependent
opsi yang diteruskan ke asosiasi. Namun, selama pengujian, saya menemukan efek samping berikut di mana callback hanya dijalankan untukdelete
dan tidakdelete_all
dependent: :destroy
Contoh:sumber