Ecto has_many:通过形式

时间:2015-10-14 14:22:21

标签: elixir phoenix-framework ecto

我正在尝试在Ecto中建立has_many :through关系,以便在User模型和Group模型之间建立多人关系。

我在网上找到的唯一信息与JoséValimhere的帖子中的嵌套属性有关(顺便说一句,这很好)。

由于系统中已存在组,我希望进行多选输入。这样做我遇到了几个问题。我不相信可以直接在变更集中分配groups关联,因为每次我尝试这样做时都会收到错误。我的下一个想法是手动完成工作(查找,删除和插入GroupMembership记录),但我不确定这是否是正确的路径,并希望先得到一些建议。

由于代码示例有很多行,我提出了要点here

如果我更喜欢直接在这个问题中发帖,我当然可以这样做。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

不幸的是,Ecto 1.0不支持多对多。这意味着您需要接收ID并手动为与用户关联的每个组建立中间关联。我们希望在以后的版本中更容易实现这一点。

编辑:Ecto 2.0支持many_to_many。

答案 1 :(得分:0)

Ecto 2.0中引入的many_to_many关联通过join_through选项支持此用例:

  

:join_through-指定关联数据的来源。它可以是代表基础存储表的字符串,例如“ posts_tags”,也可以是代表架构的原子,例如MyApp.PostTag。此选项是必需的。

这意味着您可以为联接表指定一个Ecto模式,然后在其他两个模式中指向它,如以下示例所示:

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