Uit de fijne handleiding :
Dus :delete_all
zorgt wel voor buitenlandse sleutels, maar aangezien er geen callbacks worden aangeroepen, gaat het maar één niveau diep. Dus dit in Company
:
has_many :projects, dependent: :delete_all
betekent dat het aanroepen van #destroy
op een bedrijf verwijdert direct de bijbehorende projects
uit de databank. Maar dat ziet dit niet:
has_many :tasks, dependent: :delete_all
die je hebt in Project
en uiteindelijk probeer je projecten te verwijderen waarnaar nog steeds wordt verwezen in tasks
zoals de foutmelding aangeeft.
Je zou al je associaties kunnen veranderen in dependent: :destroy
, dit zal alles uit de database halen voordat ze worden vernietigd en callbacks worden aangeroepen (waardoor meer dingen uit de database worden geladen om ze te vernietigen, waardoor meer dingen uit de database worden geladen...). Het eindresultaat zal veel database-activiteit zijn, maar alle externe sleutels zullen correct worden gevolgd.
Als alternatief kunt u de logica in de database plaatsen waar deze gewoonlijk thuishoort door on delete cascade
over de externe sleutelbeperkingen
:
Uw add_foreign_key
oproepen zouden er als volgt uitzien:
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
in dit geval. Je zou waarschijnlijk de dependent: :delete_all
. willen laten staan s in uw modellen als herinnering aan wat er aan de hand is, of u kunt een opmerking voor uzelf achterlaten.