我在elixir中有一个小管道,它是关于改变ecto模型状态:
model
|> cast(params, ~w(something), ~w())
|> conditional
|> Repo.update
Run Code Online (Sandbox Code Playgroud)
问题是我的conditional管道有时可能是零,所以在它没有的情况下它应该什么都不做并且可以工作(我认为它会是fn(x) -> x end)
所以,我的问题是:"我怎么能这样做"?
NoD*_*ame 17
model
|> cast(params, ~w(something), ~w())
|> maybe_do_something(conditional)
|> Repo.update
defp maybe_do_something(changeset, nil), do: changeset
defp maybe_do_something(changeset, func) do
# Do something with changeset
end
Run Code Online (Sandbox Code Playgroud)
不确定我的问题是否正确,但也许这就是你要找的东西.
管道非常适合不会失败的操作,所有这些操作都将随身携带.如果你想停止管道,你不能.你必须写这样的函数:
maybe_repo_update(nil), do: nil
maybe_repo_update(data), do: Repo.update(data)
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,Elixir 1.2中有一个新的特殊形式叫做with.它可以在某些不匹配的时刻停止管道:
with changeset <- cast(model, params, ~w(something), ~w())
{:ok, changeset} <- conditional_operation(changeset)
{:ok, model} <- Repo.insert(changeset)
Run Code Online (Sandbox Code Playgroud)
这将确保如果条件操作返回别的东西{:ok, changeset},它将不会尝试运行最后一个repo插入.在Elixir 1.3中,您也可以使用else部分.
但是对于变更集,使用@JustMichael建议的解决方案更为常见:
def conditional(changeset) do
if something_to_do do
transform(changeset)
else
changeset
end
end
Run Code Online (Sandbox Code Playgroud)
该解决方案将始终运行该Repo.update部件.
| 归档时间: |
|
| 查看次数: |
5605 次 |
| 最近记录: |