2015-11-26 84 views
3

我有兩種模式:用戶和組。它們通過連接表與很多人聯繫起來。試圖刪除模型時elixir刪除多對多關聯

**(Ecto.ConstraintError)約束錯誤:

* foreign_key: groups_user_id_key 

我應該怎麼做才能 當我嘗試刪除用戶(或一組),它提出了這個錯誤刪除任何父模型?

回答

8

該數據庫將引發這樣的錯誤,因爲連接表仍持有用戶/組你想刪除的參考。 有該問題的多個解決方案:

  • 您可以刪除所有的手工
  • 刪除用戶/組之前,連接表項在您的組/用戶架構的連接模型關聯,您可以設置on_delete: :delete_all選項
  • 您可以通過references(table, on_delete: :delete_all)的外鍵約束定義中的遷移,在數據庫中設置ON DELETE CASCADE選項。

你可以在這裏找到更多關於這個外生文檔中:http://hexdocs.pm/ecto/Ecto.Schema.html#has_many/3這裏:http://hexdocs.pm/ecto/Ecto.Migration.html#references/2

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