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.