FineManual から :
したがって、:delete_all
外部キーを処理しますが、コールバックが呼び出されないため、1レベルの深さしかありません。つまり、これはCompany
:
has_many :projects, dependent: :delete_all
#destroy
を呼び出すことを意味します 会社では、関連するprojects
を直接削除します データベースから。しかし、これはわかりません:
has_many :tasks, dependent: :delete_all
Project
にあるもの そして、tasks
でまだ参照されているプロジェクトを削除しようとすることになります。 エラーメッセージが示すように。
すべての関連付けをdependent: :destroy
に切り替えることができます 、これはそれらを破壊する前にデータベースからすべてを引き出し、コールバックが呼び出されます(データベースからより多くのものをロードするためにそれらを破壊するためだけにデータベースからより多くのものをロードします...)。最終的には多くのデータベースアクティビティが発生しますが、すべての外部キーは適切に追跡されます。
または、on delete cascade
外部キー制約について
:
add_foreign_key
通話は次のようになります:
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
この場合。おそらくdependent: :delete_all
のままにしておきたいでしょう 何が起こっているかを思い出させるためにモデルに入れてください。または、コメントを残すこともできます。