ЭКТО имеет много: сквозное в форме


Я пытаюсь получить отношение has_many :through, работающее в Ecto для многих-многих отношений между моделью User и моделью Group.

Единственная информация, которую я смог найти в интернете, была связана с вложенными атрибутами в посте Хосе Валима здесь (что, кстати, отлично).

Поскольку группы уже существуют в системе, я надеялся сделать множественный выбор входных данных. При этом я столкнулся с парой проблем. Я не верю, что можно назначить groups ассоциация в наборе изменений непосредственно потому, что я получал ошибку каждый раз, когда я пытался сделать это. Моей следующей мыслью было выполнить работу вручную (найти, удалить и вставить записи GroupMembership), однако я не был уверен, что это правильный путь, и хотел сначала получить совет.

Поскольку образец кода содержит довольно много строк, я сделал здесь суть.

Если вы предпочитаете, чтобы я разместил его непосредственно в этом вопросе, я, безусловно, могу это сделать.

Спасибо за вся помощь!

2 6

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