我在用户和设施之间有很多联系:
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
错误。
答案 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
。
这意味着,当您在变更集中传递关联的记录时,它将删除与之前关联但不在当前变更集中的记录的关联。它不会删除关联的记录。