elixir删除多对多关联

时间:2015-11-26 12:48:47

标签: elixir phoenix-framework

我有两个模型:用户和组。它们是通过连接表关联的多对多。 当我尝试删除用户(或组)时,会引发此错误:

尝试删除模型时

**(Ecto.ConstraintError)约束错误:

* foreign_key: groups_user_id_key

如何删除任何父模型?

2 个答案:

答案 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宏。

https://hexdocs.pm/ecto/Ecto.Model.Dependent.html