6

我试图在 Ecto 中建立一种关系,以实现模型和模型has_many :through之间的多对多关系。UserGroup

我能在网上找到的唯一信息与 José Valim在这里的一篇文章中的嵌套属性有关(顺便说一句,这非常好)。

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

由于代码示例有很多行,我在这里做了一个要点。

如果我希望我直接在这个问题中发布它,我当然可以这样做。

感谢所有的帮助!

4

2 回答 2

4

不幸的是,Ecto 1.0 不支持多对多。这意味着您将需要接收 ID 并为您与用户关联的每个组手动构建中间关联。我们希望在未来的版本中使这更容易。

编辑:Ecto 2.0 支持 many_to_many。

于 2015-10-14T21:45:08.387 回答
1

many_to_manyEcto 2.0 中引入的关联通过以下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
于 2018-07-31T05:22:44.367 回答