2016-02-19 6 views
8

Ich versuche, eine einzige Änderung schreiben, die ein Modell aktualisieren und eine Zuordnung einfügen wird. Ich kann keine Beispiele finden, wie put_assoc/4Ecto: Wie Update und Einfügen von Zuordnung in einem Update mit put_assoc

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! 

Diese verwenden die folgenden Fehler ausdruckt:

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

[] 

Alle Beispiele, die ich auf für put_assoc/4 aussehen kann? Wie kann ich herausfinden, warum das Änderungsset ungültig ist?

Das Ziel der Dinge auf diese Weise ist, dass ich hoffe, die neue order würde order_errors vorinstalliert haben.

Antwort

5

Ich habe gefunden, wie man es in der Ecto tests funktioniert. Kurzgeschichte, entfernen Sie einfach die changeset Erstellung und verwenden Sie direkt ein neues Modell.

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! 

ich noch wissen möchte, wie die Fehlermeldung von der ursprünglichen Nachricht verstehen