Ecto中如何通过主键实现多对多关联?

How to achieve many-to-many association in Ecto with primary keys?

我有三个 table、permissionspermission_sets 和它们的连接点 table permission_set_permissions.

permissions table 保存 Permission 模型数据,并且此 table 的大小是确定性的。澄清一下,当应用程序为 运行.

时,我们不会向此 table 插入任何数据

模型 PermissionSet 坚持 permission_sets table 与 Permission.

存在多对多关系

通常,您会根据该请求创建一个 PermissionSet

POST /api/v1/permission_sets/

{
    "permission_set": {
        "name": "default",
        "description": "Default permission set.",
        "permissions": [
            {
                "type": "all",
                "required_grant_power": 200,
                "controller_name": "Elixir.MyApp.UserController",
                "controller_action": "index"
            },
            {
                "type": "one",
                "required_grant_power": 200,
                "controller_name": "Elixir.MyApp.UserController",
                "controller_action": "show"
            }
        ]
    }
}

但是,这会用给定的数据创建新的 Permissions。

就我而言,我想重用现有权限及其主键。一个例子是:

POST /api/v1/permission_sets/

{
    "permission_set": {
        "name": "default",
        "description": "Default permission set.",
        "permission_ids": [
            2,
            7
        ]
    }
}

你对实现这个有什么建议吗?我是否应该创建一个名为 PermissionSetPermission 的新模型来表示交汇点 table?

像这样的东西应该可以完成工作:

def changeset(struct, params \ %{}) do
  permissions = 
    Permission
    |> where([p], p.id in ^params[:permission_ids])
    |> Repo.all

  struct
  |> cast(params, [:name, :description])
  |> put_assoc(:permissions, permissions)
end