程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Ecto.Multi.run/3大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Ecto.Multi.run/3?

开发过程中遇到Ecto.Multi.run/3的问题如何解决?下面主要结合日常开发的经验,给出你关于Ecto.Multi.run/3的解决方法建议,希望对你解决Ecto.Multi.run/3有所启发或帮助;

遵循本教程 https://curiosum.dev/blog/elixir-ecto-database-transactions

  alias Ecto.Multi
  alias ElixirRest.Account
  import Ecto.query,only: [from: 2]

  require Logger

  def transfer_money(acc1_ID,acc2_ID,amount) do
    Multi.new()
    |> Multi.run(:retrIEve_accounts_step,retrIEve_accounts(acc1_ID,acc2_ID))
    |> Multi.run(:verify_balances_step,verify_balances(amount))
    |> Multi.run(:subtract_from_a_step,&subtract_from_a/2)
    |> Multi.run(:add_to_b_step,&add_to_b/2)
  end

  defp retrIEve_accounts(acc1_ID,acc2_ID) do
    fn repo,_ ->
      case from(acc in Account,where: acc.ID in [^acc1_ID,^acc2_ID]) |> repo.all() do
        [acc_a,acc_b] -> {:ok,{acc_a,acc_b}}
        _ -> {:error,:account_not_found}
      end
    end
  end

  defp verify_balances(transfer_amount) do
    fn _repo,%{retrIEve_accounts_step: {acc_a,acc_b}} ->
      if acc_a.balance < transfer_amount,do: {:error,:balance_too_low},else: {:ok,acc_b,transfer_amount}}
    end
  end

  defp subtract_from_a(repo,%{verify_balances_step: {acc_a,_,verifIEd_amount}}) do
    acc_a
    |> Account.changeset(%{balance: acc_a.balance - verifIEd_amount})
    |> repo.update()
  end

  defp add_to_b(repo,%{verify_balances_step: {_,verifIEd_amount}}) do
    acc_b
    |> Account.changeset(%{balance: acc_b.balance + verifIEd_amount})
    |> repo.update()
  end
end

这样调用:
ElixirRest.Account.Batches.transfer_money(input.from_account,input.to_account,input.sum) |> ElixirRest.Repo.transaction()

错误信息:

[error] #PID<0.459.0> running ElixirRestWeb.Endpoint (cowboy_protocol) terminated
Server: localhost:8081 (http)
Request: POST /API/graphiql
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Ecto.Multi.run/3
        (ecto 2.2.12) lib/ecto/multi.ex:309: Ecto.Multi.run(%Ecto.Multi{names: #MapSet<[]>,operations: []},:retrIEve_accounts_step,#Function<0.17156638/2 in ElixirRest.Account.Batches.retrIEve_accounts/2>)
        (elixir_rest 0.0.1) lib/elixir_rest_web/resolvers/transaction_resolver.ex:17: ElixirRestWeb.Resolvers.TransactionResolver.create_transaction/3
        (absinthe 1.4.16) lib/absinthe/resolution.ex:209: Absinthe.Resolution.call/2
        (absinthe 1.4.16) lib/absinthe/phase/document/execution/resolution.ex:209: Absinthe.Phase.document.Execution.Resolution.reduce_resolution/1
        (absinthe 1.4.16) lib/absinthe/phase/document/execution/resolution.ex:168: Absinthe.Phase.document.Execution.Resolution.do_resolve_fIEld/4
        (absinthe 1.4.16) lib/absinthe/phase/document/execution/resolution.ex:153: 

是什么导致了这个问题? 是什么导致了这个问题? 是什么导致了这个问题? 是什么导致了这个问题? 是什么导致了这个问题? 是什么导致了这个问题? 是什么导致了这个问题?

代码:问题中的写作比例是一个愚蠢的验证

解决方法

我使用的是过时版本的 ecto,(2.2)

我以为我在 3 但我不是。

大佬总结

以上是大佬教程为你收集整理的Ecto.Multi.run/3全部内容,希望文章能够帮你解决Ecto.Multi.run/3所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: