Ecto中的多对多关系

Ter*_*how 32 elixir ecto phoenix-framework

我有一个用户模型和一个聊天模型.直观地,多个人将在任何时间属于同一个聊天组,每个人可以拥有许多聊天组.因此聊天组必须属于多个人user_id的.

我的聊天组和用户的架构是:

schema "chatGroups" do
    field :name, :string
    has_many :messages, Message
    belongs_to :user, User

    timestamps
end

schema "users" do
    field :name, :string
    has_many :chatGroups, ChatGroup

    timestamps
end
Run Code Online (Sandbox Code Playgroud)

任何建议如何处理这个?

kgp*_*per 36

这是一个古老的问题,以前接受的答案不再是事实上的方式.

Ecto现在支持HABTM或多对多关联.

https://hexdocs.pm/ecto/Ecto.Schema.html#many_to_many/3

many_to_many :users, MyApp.User, join_through: "chat_group_users"
Run Code Online (Sandbox Code Playgroud)


Gaz*_*ler 35

Ecto 通过关系支持has_many/3.这涉及在聊天组和用户之间创建中间表.

您可以使用以下架构执行此操作:

chat_group.ex:

schema "chat_groups" do
  has_many :chat_group_users, MyApp.ChatGroupUser
  has_many :users, through: [:chat_group_users, :user]
end
Run Code Online (Sandbox Code Playgroud)

chat_group_user.ex:

schema "chat_group_users" do
  belongs_to :chat_group, MyApp.ChatGroup
  belongs_to :user, MyApp.User
end
Run Code Online (Sandbox Code Playgroud)

您也可以通过其他方式进行关联:

user.ex:

schema "users" do
  has_many :chat_group_users, MyApp.ChatGroupUsers
  has_many :chats, through: [:chat_group_users, :chat]
end
Run Code Online (Sandbox Code Playgroud)

这允许您执行以下操作:

Repo.get(Chat, 1) |> Repo.preload(:users)
Run Code Online (Sandbox Code Playgroud)

这将获取聊天模型的用户并:user使用值填充键.

  • 该死.我希望找到一个不需要创建连接表的解决方案.那好吧.谢谢你的澄清!我将在本周末进行调查,并在我这样做后接受. (2认同)