Elixir Ecto:有人可以举例说明Ecto.Multi.run/5

Ole*_*ann 4 elixir ecto

文档的状态

run(t, name, module, function, args) :: t when function: atom, args: [any]
Run Code Online (Sandbox Code Playgroud)

类似于run/3,但允许传递模块名称,函数和参数.该函数应该返回{:ok, value}或者{:error, value},并且将接收到第一个参数的变化(预先设置为在函数调用中传递的参数).

但我不确定如何使用它.假设我有这个函数我想在里面运行Ecto.Multi:

def some_fun(value, other_value) do
  case value do
    nil -> {:error, other_value}
    _ -> {:ok, other_value}
  end
end
Run Code Online (Sandbox Code Playgroud)

那会怎么样?

Dog*_*ert 10

我假设你想value成为"迄今为止的变化",并且other_value是你在调用时指定的值Multi.run/5.在这种情况下,如果您的函数位于名为的模块中Foo:

defmodule Foo do
  def some_fun(value, other_value) do
    case value do
      nil -> {:error, other_value}
      _ -> {:ok, other_value}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你的Multi.run/5电话会是:

Multi.run(multi, name, Foo, :some_fun, [other_value])
Run Code Online (Sandbox Code Playgroud)

这相当于以下Multi.run/3调用:

Multi.run(multi, name, fn value -> Foo.some_fun(value, other_value) end)
Run Code Online (Sandbox Code Playgroud)