Dari manual bagus :
Jadi :delete_all
memang menangani kunci asing tetapi, karena tidak ada panggilan balik yang dipanggil, itu hanya masuk satu tingkat. Jadi ini di Company
:
has_many :projects, dependent: :delete_all
artinya memanggil #destroy
pada perusahaan akan langsung menghapus projects
yang terkait dari basis data. Tapi itu tidak akan melihat ini:
has_many :tasks, dependent: :delete_all
yang Anda miliki di Project
dan Anda akhirnya mencoba menghapus proyek yang masih direferensikan di tasks
seperti yang ditunjukkan oleh pesan kesalahan.
Anda dapat mengalihkan semua asosiasi Anda ke dependent: :destroy
, ini akan menarik semuanya keluar dari database sebelum menghancurkannya dan panggilan balik akan dipanggil (yang akan memuat lebih banyak hal dari database hanya untuk menghancurkannya yang akan memuat lebih banyak hal dari database...). Hasil akhirnya akan banyak aktivitas database tetapi semua kunci asing akan diikuti dengan benar.
Atau, Anda dapat meletakkan logika di dalam basis data yang biasanya berada dengan menentukan on delete cascade
pada batasan kunci asing
:
add_foreign_key
. Anda panggilan akan terlihat seperti:
add_foreign_key "projects", "companies", on_delete: :cascade
add_foreign_key "tasks", "projects", on_delete: :cascade
add_foreign_key "task_times", "tasks", on_delete: :cascade
pada kasus ini. Anda mungkin ingin meninggalkan dependent: :delete_all
s di model Anda sebagai pengingat tentang apa yang terjadi, atau Anda dapat meninggalkan komentar untuk diri sendiri.