web-dev-qa-db-fra.com

Relation plusieurs à plusieurs dans Ecto

J'ai un modèle Utilisateurs et un modèle Chats. Intuitivement, plusieurs personnes appartiennent à tout moment au même groupe de discussion et chaque personne peut avoir plusieurs groupes de discussion. Par conséquent, le groupe de discussion doit appartenir à plusieurs user_id.

Mon schéma pour le groupe de discussion et les utilisateurs est le suivant:

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

Des suggestions sur la façon de gérer cela?

32
Terence Chow

C'est une vieille question et la réponse précédemment acceptée n'était plus de facto.

Ecto prend désormais en charge HABTM ou plusieurs à plusieurs associations.

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

many_to_many :users, MyApp.User, join_through: "chat_group_users"
35
kgpdeveloper

Ecto prend en charge has_many/ via les relations. Cela implique de créer une table intermédiaire entre vos groupes de discussion et vos utilisateurs.

Vous pouvez le faire avec le schéma suivant:

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

Vous pouvez également faire l'association dans l'autre sens:

user.ex:

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

Cela vous permet de faire des choses comme:

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

Cela va chercher les utilisateurs pour votre modèle de chat et remplir le :user clé avec la valeur.

35
Gazler