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ář.