Z dobré příručky :
Takže :delete_all
se stará o cizí klíče, ale protože nejsou vyvolána žádná zpětná volání, jde pouze o jednu úroveň hluboko. Takže toto v Company
:
has_many :projects, dependent: :delete_all
znamená, že volání #destroy
na společnosti přímo odstraní související projects
z databáze. To ale neuvidí toto:
has_many :tasks, dependent: :delete_all
které máte v Project
a nakonec se pokusíte odstranit projekty, na které se stále odkazuje v tasks
jak ukazuje chybová zpráva.
Můžete přepnout všechna svá přidružení na dependent: :destroy
, tím se vše vytáhne z databáze před jejich zničením a budou volána zpětná volání (která načtou více věcí z databáze, jen aby je zničila, čímž se načtou další věci z databáze...). Konečným výsledkem bude velká databázová aktivita, ale všechny cizí klíče budou správně dodrženy.
Alternativně můžete logiku umístit do databáze, kam obvykle patří, zadáním on delete cascade
na omezení cizího klíče
:
Váš add_foreign_key
hovory by vypadaly takto:
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
v tomto případě. Pravděpodobně budete chtít ponechat dependent: :delete_all
s ve vašich modelech jako připomínka toho, co se děje, nebo můžete zanechat komentář.