Från den fina manualen :
Så :delete_all
tar hand om främmande nycklar men eftersom inga återuppringningar anropas går det bara en nivå djupt. Så detta i Company
:
has_many :projects, dependent: :delete_all
betyder att anropet #destroy
på ett företag kommer direkt att radera de associerade projects
från databasen. Men det kommer inte att se detta:
has_many :tasks, dependent: :delete_all
som du har i Project
och det slutar med att du försöker ta bort projekt som fortfarande hänvisas till i tasks
som felmeddelandet indikerar.
Du kan byta alla dina associationer till dependent: :destroy
, kommer detta att dra ut allt ur databasen innan de förstörs och callbacks kommer att anropas (vilket kommer att ladda fler saker ur databasen bara för att förstöra dem vilket kommer att ladda fler saker ur databasen...). Slutresultatet kommer att bli mycket databasaktivitet men alla främmande nycklar kommer att följas ordentligt.
Alternativt kan du placera logiken i databasen där den vanligtvis hör hemma genom att ange on delete cascade
på de främmande nyckelbegränsningarna
:
Din add_foreign_key
samtal skulle se ut så här:
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
I detta fall. Du skulle förmodligen vilja lämna dependent: :delete_all
finns i dina modeller som en påminnelse om vad som händer, eller så kan du lämna en kommentar till dig själv.