Ecto中如何通过主键实现多对多关联?
How to achieve many-to-many association in Ecto with primary keys?
我有三个 table、permissions
、permission_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"
}
]
}
}
但是,这会用给定的数据创建新的 Permission
s。
就我而言,我想重用现有权限及其主键。一个例子是:
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
我有三个 table、permissions
、permission_sets
和它们的连接点 table permission_set_permissions
.
permissions
table 保存 Permission
模型数据,并且此 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"
}
]
}
}
但是,这会用给定的数据创建新的 Permission
s。
就我而言,我想重用现有权限及其主键。一个例子是:
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