Elixir 在Phoenix 1.3中,如何与上下文建立多对多关系?
我试图理解凤凰城1.3的背景 我理解上下文的可分性(在我看来,这是微型应用程序,具有明确定义的API边界),但当我试图弄清楚如何在它们之间建立多对多关系时,我很挣扎 在构建slack克隆的情况下,一个用户可以有多个聊天室,而一个聊天室可以有多个用户 在基于“模型”的方法中,您可以创建一个中间表user\u rooms(带有user\u id、room\u id字段),然后通过进行Elixir 在Phoenix 1.3中,如何与上下文建立多对多关系?,elixir,phoenix-framework,Elixir,Phoenix Framework,我试图理解凤凰城1.3的背景 我理解上下文的可分性(在我看来,这是微型应用程序,具有明确定义的API边界),但当我试图弄清楚如何在它们之间建立多对多关系时,我很挣扎 在构建slack克隆的情况下,一个用户可以有多个聊天室,而一个聊天室可以有多个用户 在基于“模型”的方法中,您可以创建一个中间表user\u rooms(带有user\u id、room\u id字段),然后通过进行连接 让我困惑的是: 如果我想让这些表保持真正的孤立,我真的想加入表吗?这没有什么区别 如果我必须保留我的中间表us
连接
让我困惑的是:
- 如果我想让这些表保持真正的孤立,我真的想加入表吗?这没有什么区别
- 如果我必须保留我的中间表user_rooms,那么应该放在什么上下文中
(作为背景,我正在尝试执行此步骤的第4步)考虑上下文的一种方法是在设计应用程序时将其视为一个抽象层。当它被放入
凤凰城项目的结构类似于长生不老药和任何其他长生不老药
项目–我们将代码拆分为上下文。一个上下文将创建一个组
相关功能,如帖子和评论,通常封装
数据访问和数据验证等模式。通过使用上下文,
我们将系统解耦并隔离为可管理的、独立的
零件
因此,模型本身及其底层模式是您分组到上下文中的单元。模型可以有更细粒度的api,这是其内部工作所必需的。上下文反过来只公开对其他应用程序组件或上下文有用的方法,从而隐藏模型的底层实现细节
没有必要将上下文边界向下扩展到模型级别以实现绝对隔离。相反,您可以像往常一样创建模式,使用模型上需要的所有多对多关系。然后直接在模型上实现任何底层方法。只在上下文中放置那些属于上下文的公共api或涉及多个模型的私有方法的方法
更新
在您的场景中,您可以在聊天
上下文中放置房间
方法。其签名可能是(用户)
的聊天室Repo.get()
也作为上下文,例如def get(id),do:Repo.get(User,id)
。这些模型最终包含变更集、验证方法和私有方法,而不依赖于其他模型。上下文反过来获得了组中大多数公开可用的业务逻辑方法。那么,如果我想要一个方法User.rooms(),它列出了用户拥有的文件室,该怎么办?我会在user_controller.ex上创建它-这看起来不像是分离。那么我应该把实际的Repo.get()放在哪里呢?