代码之家  ›  专栏  ›  技术社区  ›  cjm2671

在菲尼克斯1.3中,你如何与上下文建立多对多关系?

  •  0
  • cjm2671  · 技术社区  · 7 年前

    我试着去理解菲尼克斯1.3的背景。

    我理解上下文之间的可分性(在我看来,这是一种微型应用,有着清晰定义的API边界),但我在试图弄清楚如何在它们之间建立多对多的关系时却很费劲。

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

    在基于“模型”的方法中,您可以创建一个中间表user_rooms(带有字段user_id,room_id),然后 join_through .

    让我困惑的是:

    • 如果我要保持这些是真正的孤立,我真的想加入表吗?这件事没什么区别。
    • 如果我必须保留我的中间表用户室,应该在什么上下文中进行?

    (作为背景,我想做第四步 https://medium.com/@benhansen/lets-build-a-slack-clone-with-elixir-phoenix-and-react-part-4-creating-chat-rooms-80dc74f4f704 )

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nic Nilov    7 年前

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

    凤凰计划的结构像Elixir和任何其他药剂。 项目我们将代码分成上下文。上下文将分组 相关功能,如帖子和评论,通常封装 数据访问和数据验证等模式。通过使用上下文, 我们将系统分离并隔离成可管理的、独立的 部分。

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

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

    更新

    在你的场景中,你可能有。 Chats 你把 rooms 方法。它的签名可能是。 Chats.rooms_of(user) . Repo.get() 也会转到上下文,例如。 def get(id), do: Repo.get(User, id) . 模型最终包含变更集、验证方法、私有方法,而不依赖于其他模型。上下文反过来获取该组公开可用的大多数业务逻辑方法。