Подтвердить что ты не робот

От многих до многих отношений в 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

Любые предложения, как справиться с этим?

4b9b3361

Ответ 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 значением.