Dalam panduan rel dijelaskan seperti ini:
Selain itu objek akan dihancurkan jika dikaitkan
:dependent => :destroy
, dan dihapus jika dikaitkan:dependent => :delete_all
Benar, keren. Tetapi apa perbedaan antara dihancurkan dan dihapus? Saya mencoba keduanya dan tampaknya melakukan hal yang sama.
ruby-on-rails
ruby
model
associations
Sergey
sumber
sumber
Pada asosiasi model Rails, Anda dapat menentukan
:dependent
opsi, yang dapat mengambil salah satu dari tiga bentuk berikut::destroy/:destroy_all
Objek terkait dihancurkan bersama objek ini dengan memanggildestroy
metode mereka:delete/:delete_all
Semua objek yang terkait dihancurkan segera tanpa memanggil:destroy
metode mereka:nullify
Kunci asing semua objek terkait diatur keNULL
tanpa memanggilsave
panggilan baliknyasumber
:restrict
. Jika diatur ke: batasi objek ini tidak dapat dihapus jika memiliki objek terkait.:delete
atau:destroy_all
pilihan oleh tampilannya? Opsi: dependen mengharapkan: menghancurkan,: delete_all,: nullify atau: membatasi (: delete):delete
dan:destroy_all
opsi tidak ada. Namun, ada metode kelas pada model yang dipanggildelete
dandestroy_all
mungkin itu menjadi alasan kebingungan.Lihat menghancurkan menghapus elemen yang terkait di mana delete_all dapat menghapus beberapa data dari tabel diri sebagai
DELETE * FROM table where field = 'xyz'
: Opsi tergantung yang mungkin:
Mengontrol apa yang terjadi pada objek terkait ketika pemiliknya dihancurkan. Perhatikan bahwa ini diimplementasikan sebagai callback, dan Rails mengeksekusi callback secara berurutan. Oleh karena itu, panggilan balik serupa lainnya dapat memengaruhi: perilaku dependen, dan
:dependent
perilaku tersebut dapat memengaruhi panggilan balik lain.:destroy
menyebabkan semua benda terkait juga hancur.:delete_all
menyebabkan semua objek terkait dihapus langsung dari database (jadi panggilan balik tidak akan dieksekusi).:nullify
menyebabkan kunci asing diatur ke NULL. Panggilan balik tidak dilakukan.:restrict_with_exception
menyebabkan pengecualian untuk dimunculkan jika ada catatan terkait.:restrict_with_error
menyebabkan kesalahan ditambahkan ke pemilik jika ada objek terkait.Jika menggunakan dengan
:through
opsi, asosiasi pada model bergabung haruslah menjadi milik_ untuk, dan catatan yang bisa dihapus adalah catatan bergabung, bukan catatan terkait.sumber
Sebenarnya perbedaan utama adalah bahwa setiap panggilan balik tidak akan dipanggil ketika
:delete_all
digunakan. Tetapi ketika digunakan:destroy
tumpukan callback (:after_destroy
,:after_commit
...) akan dipecat.Akibatnya, jika Anda memiliki
touch:
deklarasi dalam model yang dihapus maka lebih baik menggunakandependent: :delete_all
'depend:: destroy'.sumber