Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
elixir-如何将条件管道添加到管道中?_Elixir_Ecto - Fatal编程技术网

elixir-如何将条件管道添加到管道中?

elixir-如何将条件管道添加到管道中?,elixir,ecto,Elixir,Ecto,我在elixir中有一个小管道,它是关于改变exto模型状态的: model |> cast(params, ~w(something), ~w()) |> conditional |> Repo.update 问题是,我有一个条件管道,它有时可能为零,因此在它为零的情况下,它应该什么都不做,并且可以工作(我假设它将是fn(x)->x end) 所以,我的问题是:“我怎么做?” 我不确定你的问题是否正确,但也许这正是你想要的。管道对于不会失败的操作来说是非常好的,而且所有管道

我在elixir中有一个小管道,它是关于改变
exto
模型状态的:

model
|> cast(params, ~w(something), ~w())
|> conditional
|> Repo.update
问题是,我有一个
条件管道,它有时可能为零,因此在它为零的情况下,它应该什么都不做,并且可以工作(我假设它将是
fn(x)->x end

所以,我的问题是:“我怎么做?”


我不确定你的问题是否正确,但也许这正是你想要的。

管道对于不会失败的操作来说是非常好的,而且所有管道都会被携带。如果你想停止管道,你不能。您必须编写如下函数:

maybe_repo_update(nil), do: nil
maybe_repo_update(data), do: Repo.update(data)
为了解决这个问题,Elixir1.2中有一种新的特殊形式,叫做
with
。它可以在不匹配的时刻停止管道:

with changeset <- cast(model, params, ~w(something), ~w())
  {:ok, changeset} <- conditional_operation(changeset)
  {:ok, model} <- Repo.insert(changeset)

此解决方案将始终运行
Repo.update
部分。

我是长生不老药新手,所以请不要太苛刻:)

为什么不使用匿名函数呢

model
|> cast(params, ~w(something), ~w())
|> (fn(n) -> conditional && n |> Repo.update || n end).()

那么
conditional
是函数还是nil?这是个好问题
def conditional(changeset) do
  if something_to_do do
    transform(changeset)
  else
    changeset
  end
end
model
|> cast(params, ~w(something), ~w())
|> (fn(n) -> conditional && n |> Repo.update || n end).()