эликсир удалить ассоциацию многие ко многим

У меня есть две модели: User и Group. Они многие ко многим связаны через таблицу соединений. Когда я пытаюсь удалить пользователя (или группу), возникает эта ошибка:

** (Ecto.ConstraintError) ошибка ограничения при попытке удалить модель:

* foreign_key: groups_user_id_key

Что мне делать, чтобы удалить любую из родительских моделей?


person user3546621    schedule 26.11.2015    source источник


Ответы (2)


База данных вызовет такую ​​ошибку, потому что таблица соединений по-прежнему содержит ссылку на пользователя/группу, которую вы пытаетесь удалить. Есть несколько решений этих проблем:

  • Вы можете удалить все записи таблицы соединений перед удалением пользователя/группы вручную.
  • Вы можете установить параметр 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

person michalmuskala    schedule 26.11.2015

has_many :groups, MyApp.User, on_delete: :nilify_all

:on_delete варианты

Существует четыре разных поведения, которые вы можете установить для своих ассоциаций при удалении родителя:

:nothing - ничего не делает для ассоциации;

:delete_all — удаляет все ассоциации, не вызывая обратных вызовов жизненного цикла;

:nilify_all — устанавливает ссылку на модель на nil для каждой ассоциации без запуска обратного вызова жизненного цикла;

:fetch_and_delete — Явно получить все ассоциации и удалить их одну за другой, вызывая любые обратные вызовы before_delete и after_delete; Имейте в виду, что эти параметры доступны только для макросов has_many/3.

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

person Alex Troush    schedule 26.11.2015