Ich versuche, eine Rechnungsstruktur zusammen mit den zugehörigen Rechnungspositionen einzufügen. Ich kann die Rechnungsdaten einfügen und eine anonyme Funktion aufrufen, um jedes Element zu validieren, zu konvertieren und einzufügen. Da insert/2 keine Rückgabe liefert, wie kann ich die invoice_id für die Elemente abrufen, während ich immer noch die gesamte Transaktion zurücksetzen kann, wenn ein Element die Validierung oder Einfügung nicht besteht?Einfügen verknüpfter Modelle in Ecto
ich den Code in meinem eigenen Repo gesetzt haben, hier ist es:
def insertassoc(params) do
Repo.transaction(fn ->
i = Invoice.changeset(params["data"], :create)
if i.valid? do
Repo.insert(i)
else
Repo.rollback(i.errors)
end
insert_include = fn k ->
c = InvoiceItem.changeset(k, :create)
if c.valid? do
Repo.insert(c)
else
Repo.rollback(c.errors)
end
end
for include <- params["includes"] do
insert_include.(Map.merge(include, %{"invoice_id" => ????}))
end
end)
end
und hier ist, wie ich es von meinem Controller verwenden:
def create(conn, params) do
case InvoiceRepo.insertassoc(params) do
{:ok, x} ->
json conn, Map.merge(params, %{"message" => "OK"})
{:error, x} ->
json conn |> put_status(400), Map.merge(params, %{"message"
=> "Error"})
end
end
Es sind nicht viele up um da draußen Beispiele mit Ecto zu geben, es tut mir leid, wenn das Noob-Fragen sind ;-). Jeder hat eine Idee? Ich habe versucht, die Rechnungsbeilage in eine private Funktion zu setzen und einen Fallblock zu verwenden, um festzustellen, ob die Haupttransaktion zurückgesetzt werden sollte, aber ich konnte auch nicht herausfinden, wie ich die Rechnungs-ID zurückbekomme.
Vielen Dank, das ist viel eleganter. BTW, für diejenigen, die das verwenden werden, hier ist, wie ich die Fehler behandelt habe, damit sie in JSON codiert werden: 'errors = Enum.map (items, & (& 1.errors)) |> Enum.into ([invoice.errors ]) |> Enum.map (& (Enum.into (& 1,% {}))) {: errors, errors} ' –
Die API hat sich jetzt geändert, so dass' Repo.insert' durch 'Repo' ersetzt werden sollte. Einfügen! ', um das Modell zurückzugeben oder einen Fehler innerhalb der Transaktion zu erzeugen. – Arrel
Darüber hinaus unterstützt Ecto jetzt auch 'put_assoc', mit dem Sie das Elternschema neben seinen Kindern ändern können, und das würde den obigen Code viel sauberer machen! –