web-dev-qa-db-ja.com

Ectoでの多対多の関係

ユーザーモデルとチャットモデルがあります。直感的に複数の人がいつでも同じチャットグループに属し、各人は多くのチャットグループを持つことができます。したがって、チャットグループは複数のuser_id 's。

チャットグループとユーザーのスキーマは次のとおりです。

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

これを処理する方法はありますか?

31
Terence Chow

これは古い質問であり、以前に受け入れられた答えは事実上の方法ではなくなりました。

EctoはHABTMまたは多対多の関連付けをサポートするようになりました。

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

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

Ectoは、関係を通じて has_many/ をサポートしています。これには、チャットグループとユーザーの間に中間テーブルを作成することが含まれます。

これは、次のスキーマを使用して実行できます。

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キーと値。

35
Gazler