转换关联变更集

时间:2018-09-18 11:13:28

标签: elixir ecto

我在用户和设施之间有很多联系:

schema "facilities" do    
  field(:name, :string)
  field(:description, :string)    
  many_to_many(:users, User, join_through: "users_facilities")
end

schema "users" do
  field(:first_name, :string)
  field(:last_name, :string)
  field(:email_address, :string)
  field(:username, :string)
  many_to_many(:facilities, Facility, join_through: "users_facilities")
end

这是changeset_params

  %{
  name: john,
  users: [%{id: 1286, name: "john doe"}, %{id: 1287, name: "jane doe"}]
 }

它对于has_many来说很好用,并为我提供了整个关联的一个变更集。但不适用于many to many

records_struct具有与用户一起加载的完整设施关联 这是代码:

    Facility.changeset(records_struct, changeset_params)
    |> Ecto.Changeset.cast_assoc(:users)

我从Facility.changeset返回了变更集,但是当我尝试对其进行测试时,Ecto.Changeset.cast_assoc引发了internal server错误。

1 个答案:

答案 0 :(得分:0)

您的用户和设施是独立管理的。换句话说,您不会在用户的变更集中创建新的设施,反之亦然。您只想绑定/关联到现有实体,对吧?

在这种情况下,您需要Ecto.Changeset.put_assoc/4

请记住,在执行put_assoc之前,您需要预先加载关联。 另外,请确保在many_to_many关联中设置on_replace选项,例如:

many_to_many(:users, User, join_through: "users_facilities", on_replace: :delete)

对于众多的关联,您最可能希望使用:delete。 这意味着,当您在变更集中传递关联的记录时,它将删除与之前关联但不在当前变更集中的记录的关联。它不会删除关联的记录。