ЭКТО имеет много: сквозное в форме
Я пытаюсь получить отношение has_many :through
, работающее в Ecto для многих-многих отношений между моделью User
и моделью Group
.
Поскольку группы уже существуют в системе, я надеялся сделать множественный выбор входных данных. При этом я столкнулся с парой проблем. Я не верю, что можно назначить groups
ассоциация в наборе изменений непосредственно потому, что я получал ошибку каждый раз, когда я пытался сделать это. Моей следующей мыслью было выполнить работу вручную (найти, удалить и вставить записи GroupMembership
), однако я не был уверен, что это правильный путь, и хотел сначала получить совет.
Поскольку образец кода содержит довольно много строк, я сделал здесь суть.
Если вы предпочитаете, чтобы я разместил его непосредственно в этом вопросе, я, безусловно, могу это сделать.
Спасибо за вся помощь!
2 ответа:
К сожалению, Ecto 1.0 не поддерживает многие ко многим. Это означает, что вам нужно будет получить идентификаторы и вручную построить промежуточную ассоциацию для каждой группы, которую вы связываете с пользователем. Мы надеемся сделать это проще в будущих релизах.
EDIT: Ecto 2.0 поддерживает many_to_many.
Ассоциация
many_to_many
, введенная в Ecto 2.0, поддерживает этот вариант использования через опциюjoin_through
:
:join_through
- указывает источник связанных данных. Это может быть строка, например "posts_tags", представляющая базовую таблицу хранения, или атом, напримерMyApp.PostTag
, представляющий схему. Эта опция обязательна.Это означает, что вы можете указать схему Ecto для таблицы join, а затем указать на нее в двух других схемах, как в следующем примере:
defmodule MyApp.GroupMembership do use Ecto.Schema import Ecto.Changeset schema "group_memberships" do ... end end defmodule MyApp.Group do use Ecto.Schema import Ecto.Changeset schema "groups" do ... many_to_many :users, MyApp.User, join_through: MyApp.GroupMembership end end defmodule MyApp.Accounts.User do use Ecto.Schema import Ecto.Changeset schema "users" do ... many_to_many :groups, MyApp.Group, join_through: MyApp.GroupMembership end end