【问题标题】:Ecto has_many :through in formEcto has_many:通过形式
【发布时间】:2018-07-31 13:22:44
【问题描述】:

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

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

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

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

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

感谢大家的帮助!

【问题讨论】:

  • 我不会讲 Ecto 代码,但我可以讲 DB 设计原则。关系数据库排序会告诉您不能对 n 到 n 关系建模。您所做的是构建一个关系表(在您的情况下类似于 UsersInGroups),然后构建一个从用户和组到该表的 1-n。我不确定它是否会帮助您解决 Ecto 问题,但它可能是一种更好的数据建模方式。 FWIW。

标签: elixir phoenix-framework ecto


【解决方案1】:

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

编辑:Ecto 2.0 支持 many_to_many。

【讨论】:

  • 感谢您的提醒!
  • 确认一下,Ecto 确实支持 has_many :through(通过连接表),只是不支持 Rails 样式的 has_and_belongs_to_many。那正确吗?文档:hexdocs.pm/ecto/Ecto.Association.HasThrough.html
  • @José 最新版本的 ecto 仍然是这种情况吗? (截至 2018 年 1 月,为 2.27)
  • 自 Ecto 2.0 以来,Ecto 有 many_to_many(相当于 has_and_belongs_to_many)。 :)
  • Ecto 提供的实际上并不是一个很好的解决方案来解决关联现有记录的问题。 cast_assocput_assoc 也会弄乱组数据,它们基本上要求您将整个变更集发送给他们,而不是简单的 id。虽然唯一的要求是将两条记录链接在一起:在一个表中写入两个 id。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多