我正在尝试在Ecto中建立has_many :through
关系,以便在User
模型和Group
模型之间建立多人关系。
我在网上找到的唯一信息与JoséValimhere的帖子中的嵌套属性有关(顺便说一句,这很好)。
由于系统中已存在组,我希望进行多选输入。这样做我遇到了几个问题。我不相信可以直接在变更集中分配groups
关联,因为每次我尝试这样做时都会收到错误。我的下一个想法是手动完成工作(查找,删除和插入GroupMembership
记录),但我不确定这是否是正确的路径,并希望先得到一些建议。
由于代码示例有很多行,我提出了要点here。
如果我更喜欢直接在这个问题中发帖,我当然可以这样做。
感谢您的帮助!
答案 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