От многих до многих отношений в Ecto
У меня есть модель пользователей и модель Chats. Интуитивно несколько человек будут принадлежать к одной и той же группе чатов в любое время, и каждый человек может иметь много групп чатов. Поэтому группа чата должна принадлежать нескольким 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
Любые предложения, как справиться с этим?
Ответы
Ответ 1
Это старый вопрос, и ранее принятый ответ уже не был де-факто.
Ecto теперь поддерживает HABTM или многие из многих ассоциаций.
https://hexdocs.pm/ecto/Ecto.Schema.html#many_to_many/3
many_to_many :users, MyApp.User, join_through: "chat_group_users"
Ответ 2
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
chat_group_user.ex:
schema "chat_group_users" do
belongs_to :chat_group, MyApp.ChatGroup
belongs_to :user, MyApp.User
end
Вы также можете сделать связь другим способом:
user.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
значением.