パイプは失敗しない操作に最適で、すべてが常に運ばれます。パイプラインを停止したい場合は、できません。あなたは、このような関数を記述する必要があります:
maybe_repo_update(nil), do: nil
maybe_repo_update(data), do: Repo.update(data)
その問題を解決するためにwith
呼ばエリクシール1.2の新しい特殊な形式があります。
with changeset <- cast(model, params, ~w(something), ~w())
{:ok, changeset} <- conditional_operation(changeset)
{:ok, model} <- Repo.insert(changeset)
を。これは、条件付き操作は{:ok, changeset}
以外のものを返した場合、それは最後のレポインサートを実行しようとしないことを確認します:それは何かが一致していない現時点ではパイプラインを停止することができます。 Elixir 1.3では、else
の部分も使用できます。このソリューションは、常にRepo.update
一部を実行します
def conditional(changeset) do
if something_to_do do
transform(changeset)
else
changeset
end
end
:
しかしチェンジのために@JustMichaelによって提案されたソリューションを使用するのがより一般的です。
したがって、「条件付き」は関数かnilですか? – Dogbert
Yep !!!!!!!!!!!! – asiniy