【问题标题】:Ecto: How to update and insert association in one update using put_assocEcto:如何使用 put_assoc 在一次更新中更新和插入关联
【发布时间】:2016-02-19 21:08:53
【问题描述】:

我正在尝试编写一个变更集来更新模型并插入关联。我找不到有关如何使用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!

这会打印出以下错误:

** (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

[]

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

这样做的目的是希望新的order 预加载order_errors

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    我在Ecto tests 中找到了如何使它工作。短篇小说,只需删除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!
    

    我还是想知道如何理解原帖中的错误信息

    【讨论】:

      【解决方案2】:

      正如put_assoc/4 描述的有效值:

      给定的值可以是关联结构、给定关联的变更集或要应用于当前关联的变更的映射或关键字列表。在所有情况下,预计键都是原子。如果给出了地图或关键字列表并且没有关联,则会创建一个。

      如果你使用changeset,你应该使用现有的%Proj.OrderError{}put_assoc/4会自动为这个changesetupdate

      但是对于其他情况,特别是记录需要insert,使用struct ,关键字列表或地图是更好的主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 2019-10-19
        相关资源
        最近更新 更多