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