代码之家  ›  专栏  ›  技术社区  ›  script

为多对多强制转换关联变更集

  •  1
  • script  · 技术社区  · 7 年前

    我在用户和设施之间有这么多对多的关系:

    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得到changeset返回,但是 Ecto.Changeset.cast_assoc 投掷 internal server 尝试测试时出错。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Yuri Golobokov    7 年前

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

    对于这个案子,你需要 Ecto.Changeset.put_assoc/4

    请记住,在执行之前需要预加载关联 put_assoc . 还要确保设置 on_replace 你的选择 many_to_many 关联,例如:

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

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