Я пытаюсь вставить структуру счета и связанные с ним элементы счета. Я могу вставить данные счета и вызвать анонимную функцию для проверки, публикации и вставки каждого элемента. Поскольку вставка /2 не возвращает результат, как я могу получить invoice_id для элементов, все еще имея возможность откатить всю транзакцию, если один элемент не прошел проверку или вставку?
Я поместил код в свое собственное репо, вот оно:
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
и вот как я использую его с моего контроллера:
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
Есть не так много современных примеров с Ecto, так что извините, если это вопросы noob;-). У кого-нибудь есть идея? Я попытался вставить вкладку счета в закрытую функцию и использовать блок case, чтобы определить, должна ли основная транзакция откатываться назад, но я не мог понять, как вернуть идентификатор счета из этого.