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

How do you do a many-to-many relationship with contexts in Phoenix 1.3?

我正在尝试了解 Phoenix 1.3 上下文。

我了解上下文的可分离性(在我看来,我将其视为微型应用程序,具有明确定义的 API 边界),但在尝试弄清楚如何进行多对-他们之间有很多关系。

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

在基于 'model' 的方法中,您将创建一个中间 table 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 的第 4 步)

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

Phoenix projects are structured like Elixir and any other Elixir project – we split our code into contexts. A context will group related functionality, such as posts and comments, often encapsulating patterns such as data access and data validation. By using contexts, we decouple and isolate our systems into manageable, independent parts.

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

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

更新

在您的场景中,您可能有例如Chats 放置 rooms 方法的上下文。它的签名可能是例如Chats.rooms_of(user)Repo.get() 也进入上下文,例如def get(id), do: Repo.get(User, id)。模型最终包含变更集、验证方法、不依赖于其他模型的私有方法。上下文依次获取该组的大部分 public 可用的业务逻辑方法。