34

我有一个用户模型和一个聊天模型。直观上,多人在任何时候都属于同一个聊天组,每个人可以有多个聊天组。因此聊天组必须属于多个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

有什么建议如何处理吗?

4

2 回答 2

40

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

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

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

many_to_many :users, MyApp.User, join_through: "chat_group_users"
于 2016-07-06T14:50:49.267 回答
34

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

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

聊天组.ex:

schema "chat_groups" do
  has_many :chat_group_users, MyApp.ChatGroupUser
  has_many :users, through: [:chat_group_users, :user]
end

chat_group_user.ex:

schema "chat_group_users" do
  belongs_to :chat_group, MyApp.ChatGroup
  belongs_to :user, MyApp.User
end

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

用户.ex:

schema "users" do
  has_many :chat_group_users, MyApp.ChatGroupUsers
  has_many :chats, through: [:chat_group_users, :chat]
end

这使您可以执行以下操作:

Repo.get(Chat, 1) |> Repo.preload(:users)

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

于 2015-10-02T13:56:09.290 回答