Elixir 外胚层中的多对多关系
我有一个用户模型和一个聊天模型。直观地说,任何时候都会有多个人属于同一个聊天组,每个人都可以拥有多个聊天组。因此,聊天组必须属于多个Elixir 外胚层中的多对多关系,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我有一个用户模型和一个聊天模型。直观地说,任何时候都会有多个人属于同一个聊天组,每个人都可以拥有多个聊天组。因此,聊天组必须属于多个用户id 我的聊天组和用户架构如下: schema "chatGroups" do field :name, :string has_many :messages, Message belongs_to :user, User timestamps end schema "users" do field :name, :s
用户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
如何处理这个问题有什么建议吗 exto支持通过关系来实现。这涉及到在聊天组和用户之间创建一个中间表
可以使用以下架构执行此操作:
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
键。这是一个老问题,以前接受的答案不再是事实上的方式
EXTO现在支持HABTM或多对多协会
该死。我希望找到一种不需要创建联接表的解决方案。哦,好吧。谢谢你的澄清!我将在本周末对此进行调查,并在我完成调查后接受。除了语法是:
到:[:chat\u group\u users,:chat]
(注意第一个参数前面的冒号和后面的逗号,)Chowza,以这种方式显式执行此操作的好处是,您可以使用:delete_all将联接表设置为具有外键引用,以便在删除关联记录时联接表会自行清理。是否可以向关联添加条件?这应该是使用文档进行多对多操作的首选方法主要是批量更新和编辑嵌套数据。但是如何将一个人添加到聊天组中呢?由于没有定义“聊天组用户”的中间模式,我们不想让人们更新任何其他内容,只想将两者链接在一起。它应该是一个简单的插入到“chat\u group\u users”表中,但我无法在没有批量编辑(put\u assoc)或创建chat\u group\u users模式的情况下在Ecto中找到任何可以做到这一点的东西。
many_to_many :users, MyApp.User, join_through: "chat_group_users"