我有两个模型:用户和组。它们是通过连接表关联的多对多。 当我尝试删除用户(或组)时,会引发此错误:
尝试删除模型时**(Ecto.ConstraintError)约束错误:
* foreign_key: groups_user_id_key
如何删除任何父模型?
答案 0 :(得分:10)
数据库将引发此类错误,因为联接表仍保留对您尝试删除的用户/组的引用。 这个问题有多种解决方案:
on_delete: :delete_all
选项ON DELETE CASCADE
的外键约束定义中的迁移在数据库中设置references(table, on_delete: :delete_all)
选项。您可以在此处的Ecto文档中找到更多相关信息:http://hexdocs.pm/ecto/Ecto.Schema.html#has_many/3和此处:http://hexdocs.pm/ecto/Ecto.Migration.html#references/2
答案 1 :(得分:2)
has_many :groups, MyApp.User, on_delete: :nilify_all
:on_delete
选项
删除父级时,您可以为关联设置四种不同的行为:
:没有 - 对协会没有任何意义;
:delete_all - 删除所有关联而不触发生命周期回调;
:nilify_all - 为每个关联设置模型引用为nil,而不触发任何生命周期回调;
:fetch_and_delete - 显式获取所有关联并逐个删除它们,触发任何before_delete和after_delete回调; 请记住,这些选项仅适用于has_many / 3宏。