Fra den fine manual :
Så :delete_all
tager sig af fremmednøgler, men da der ikke kaldes tilbagekald, går det kun et niveau dybt. Så dette i Company
:
has_many :projects, dependent: :delete_all
betyder, at kalde #destroy
på en virksomhed vil direkte slette de tilknyttede projects
fra databasen. Men det vil ikke se dette:
has_many :tasks, dependent: :delete_all
som du har i Project
og du ender med at prøve at slette projekter, der stadig er refereret til i tasks
som fejlmeddelelsen indikerer.
Du kan skifte alle dine tilknytninger til dependent: :destroy
, dette vil trække alt ud af databasen, før de ødelægger dem, og tilbagekald vil blive kaldt (hvilket vil indlæse flere ting ud af databasen kun for at ødelægge dem, hvilket vil indlæse flere ting ud af databasen...). Slutresultatet vil være en masse databaseaktivitet, men alle fremmednøglerne vil blive fulgt korrekt.
Alternativt kan du placere logikken i databasen, hvor den normalt hører hjemme ved at angive on delete cascade
på fremmednøglebegrænsningerne
:
Din add_foreign_key
opkald ville se sådan ud:
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 dette tilfælde. Du vil sandsynligvis forlade dependent: :delete_all
er i dine modeller som en påmindelse om, hvad der sker, eller du kan efterlade dig selv en kommentar.