Ecto:如何使用put_assoc在一个更新中更新和插入关联

gma*_*tte 8 elixir ecto

我正在尝试编写一个更新模型并插入关联的变更集.我找不到如何使用的例子put_assoc/4

  order = order
    |> Proj.Order.changeset(%{state: "error", error_count: order.error_count + 1})
    |> Ecto.Changeset.put_assoc(
      :order_errors,
      [Proj.OrderError.changeset(%Proj.OrderError{}, %{reason: "not_found"})])
    |> Proj.Repo.update!
Run Code Online (Sandbox Code Playgroud)

这会打印出以下错误:

** (Ecto.InvalidChangesetError) could not perform update because changeset is invalid.

* Changeset changes

%{order_errors: [%Ecto.Changeset{action: :insert, changes: %{id: nil, inserted_at: nil, order_id: nil, reason: "not_found", updated_at: nil}, constraints: [], errors: [order_id: "can't be blank"], filters: %{}, model: %Proj.OrderError{__meta__: #Ecto.Schema.Metadata<:built>, id: nil, inserted_at: nil, order: #Ecto.Association.NotLoaded<association :order is not loaded>, order_id: nil, reason: nil, updated_at: nil}, optional: [], opts: [], params: %{"reason" => "not_found"}, prepare: [], repo: nil, required: [:order_id, :reason], types: %{id: :id, inserted_at: Ecto.DateTime, order_id: :id, reason: :string, updated_at: Ecto.DateTime}, valid?: false, validations: []}], state: "error"}

* Changeset params

%{"error_count" => 1, "state" => "error"}

* Changeset errors

[]
Run Code Online (Sandbox Code Playgroud)

我可以看看的任何例子put_assoc/4?如何找到变更集无效的原因?

做事这样的目标是,希望新orderorder_errors预装.

gma*_*tte 5

我发现如何使它在Ecto测试起作用.简短的故事,只需删除changeset创建并直接使用新模型.

  order = order
    |> Proj.Order.changeset(%{state: "error", error_count: order.error_count + 1})
    |> Ecto.Changeset.put_assoc(
      :order_errors,
      [%Proj.OrderError{reason: "not_found"}])
    |> Proj.Repo.update!
Run Code Online (Sandbox Code Playgroud)

我仍然想知道如何理解原始帖子中的错误消息