Elixir 在Phoenix 1.3中,如何与上下文建立多对多关系?

Elixir 在Phoenix 1.3中,如何与上下文建立多对多关系?,elixir,phoenix-framework,Elixir,Phoenix Framework,我试图理解凤凰城1.3的背景 我理解上下文的可分性(在我看来,这是微型应用程序,具有明确定义的API边界),但当我试图弄清楚如何在它们之间建立多对多关系时,我很挣扎 在构建slack克隆的情况下,一个用户可以有多个聊天室,而一个聊天室可以有多个用户 在基于“模型”的方法中,您可以创建一个中间表user\u rooms(带有user\u id、room\u id字段),然后通过进行连接 让我困惑的是: 如果我想让这些表保持真正的孤立,我真的想加入表吗?这没有什么区别 如果我必须保留我的中间表us

我试图理解凤凰城1.3的背景

我理解上下文的可分性(在我看来,这是微型应用程序,具有明确定义的API边界),但当我试图弄清楚如何在它们之间建立多对多关系时,我很挣扎

在构建slack克隆的情况下,一个用户可以有多个聊天室,而一个聊天室可以有多个用户

在基于“模型”的方法中,您可以创建一个中间表user\u rooms(带有user\u id、room\u id字段),然后通过进行
连接

让我困惑的是:

  • 如果我想让这些表保持真正的孤立,我真的想加入表吗?这没有什么区别
  • 如果我必须保留我的中间表user_rooms,那么应该放在什么上下文中

(作为背景,我正在尝试执行此步骤的第4步)

考虑上下文的一种方法是在设计应用程序时将其视为一个抽象层。当它被放入

凤凰城项目的结构类似于长生不老药和任何其他长生不老药 项目–我们将代码拆分为上下文。一个上下文将创建一个组 相关功能,如帖子和评论,通常封装 数据访问和数据验证等模式。通过使用上下文, 我们将系统解耦并隔离为可管理的、独立的 零件

因此,模型本身及其底层模式是您分组到上下文中的单元。模型可以有更细粒度的api,这是其内部工作所必需的。上下文反过来只公开对其他应用程序组件或上下文有用的方法,从而隐藏模型的底层实现细节

没有必要将上下文边界向下扩展到模型级别以实现绝对隔离。相反,您可以像往常一样创建模式,使用模型上需要的所有多对多关系。然后直接在模型上实现任何底层方法。只在上下文中放置那些属于上下文的公共api或涉及多个模型的私有方法的方法

更新


在您的场景中,您可以在
聊天
上下文中放置
房间
方法。其签名可能是(用户)
的聊天室
Repo.get()
也作为上下文,例如
def get(id),do:Repo.get(User,id)
。这些模型最终包含变更集、验证方法和私有方法,而不依赖于其他模型。上下文反过来获得了组中大多数公开可用的业务逻辑方法。

那么,如果我想要一个方法User.rooms(),它列出了用户拥有的文件室,该怎么办?我会在user_controller.ex上创建它-这看起来不像是分离。那么我应该把实际的Repo.get()放在哪里呢?