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?
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"
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.