34

ユーザー モデルとチャット モデルがあります。直感的に、いつでも複数の人が同じチャット グループに所属し、各人が多くのチャット グループを持つことができます。したがって、チャット グループは複数の に属している必要があり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

これを処理する方法について何か提案はありますか?

4

2 に答える 2

40

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

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

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

many_to_many :users, MyApp.User, join_through: "chat_group_users"
于 2016-07-06T14:50:49.267 に答える
34

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

別の方法で関連付けを行うこともできます。

ユーザー.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キーに値が入力されます。

于 2015-10-02T13:56:09.290 に答える