Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 多个到多个批量插入/更新_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 多个到多个批量插入/更新

Elixir 多个到多个批量插入/更新,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我试图找出什么是保存具有多对多关系的struct的最佳方法 假设我以以下方式创建了user和role模式: 迁移: 用户架构: 角色架构: 当涉及到将单个角色与用户关联时,关联没有问题。但是,当涉及到在一个请求中关联多个角色时,我只想到了以下解决方案: 更新用户端点:/api/users/{user\u id} 请求机构: 用户变更集: 这确实有效,关联将被更新。我担心的是,我必须迭代角色,并为每个角色执行DB请求。有没有其他方法可以达到相同的结果?您可以为关联创建一个模块/模式,指向用户\u角

我试图找出什么是保存具有多对多关系的struct的最佳方法

假设我以以下方式创建了
user
role
模式:

迁移:

用户架构:

角色架构:

当涉及到将单个角色与用户关联时,关联没有问题。但是,当涉及到在一个请求中关联多个角色时,我只想到了以下解决方案:

更新用户端点:
/api/users/{user\u id}

请求机构:

用户变更集:


这确实有效,关联将被更新。我担心的是,我必须迭代角色,并为每个角色执行DB请求。有没有其他方法可以达到相同的结果?

您可以为关联创建一个模块/模式,指向
用户\u角色
表,然后插入一个
%UserRole{}
结构,在
用户
角色
之间创建关联。这样,您也可以使用
Repo.insert\u all
进行批量插入

defmodule MyApp.UserRole do
  ...
  schema "users_roles" do
    belongs_to :user, User
    belongs_to :role, Role
  end
end


我通常为
users\u-roles
创建一个模块/模式,然后添加一个关联就变成了
Repo.insert%UserRole{user\u-id:user\u-id,role\u-id:role\u-id}
(在适当的验证之后,如果需要的话)。因此,在这种情况下,我只需创建多个
%UserRole
结构,然后执行
Repo.insert\u-all
,对吗,没错。如果不在
用户角色
模式定义之前添加
@primary\u key false
,它将无法工作。否则,它抛出:
**(Postgrex.Error)错误42703(未定义的列):关系“users\u roles”的列“id”不存在
schema "users" do
  field :email, :string
  field :username, :string
  many_to_many :roles, TimesheetServer.Role, join_through: "users_roles"
 end

  def changeset(struct, params \\ %{}) do
   struct
    |> cast(params, [:email, :username])
    |> validate_required([:email, :username])
  end
end
schema "roles" do
     field :name, :string
     many_to_many :users, TimesheetServer.User, join_through: "users_roles"
   end

   def changeset(struct, params \\ %{}) do
     struct
     |> cast(params, [:name])
     |> validate_required([:name])
   end
 end
{
  "roles": [
    {"id": 10},
    {"id": 2},
    {"id": 1}
  ]
}
  def changeset(struct, params \\ %{}) do
     struct
      |> cast(params, [:email, :username])
      |> validate_required([:email, :username])
      |> put_assoc(:roles, cast_roles(params))
  end

  defp cast_roles(params) do
    %{"roles" => roles} = params
    Enum.map(roles, fn role -> get_role(role) end)
  end

  defp get_role(role) do
    %{"id" => id} = role
    Repo.get!(Role, id)
  end
defmodule MyApp.UserRole do
  ...
  schema "users_roles" do
    belongs_to :user, User
    belongs_to :role, Role
  end
end
Repo.insert! %MyApp.UserRole{user_id: 123, role_id: 456}
Repo.insert_all! MyApp.UserRole, [%{user_id: 1, role_id: 1},
                                  %{user_id: 2, role_id: 1},
                                  %{user_id: 2, role_id: 2}]