2016-05-07 10 views
3

私は万能薬では小さなパイプラインを持って、それはectoモデル状態の変更についてです:elixir - 条件付きパイプをパイプラインに追加する方法?

model 
|> cast(params, ~w(something), ~w()) 
|> conditional 
|> Repo.update 

問題は、私は時々、nilをすることができconditionalパイプを持っているということですので、それは何もしないし、できなければならないnilをする場合にはそれがあります作品(私はそれがfn(x) -> x endと思われます)

私の質問は: "私はそれを行うことができます"ですか?

+0

したがって、「条件付き」は関数かnilですか? – Dogbert

+0

Yep !!!!!!!!!!!! – asiniy

答えて

11
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 

あなたの質問が正しいかどうかわかりませんが、あなたが探しているものは多分です。

5

パイプは失敗しない操作に最適で、すべてが常に運ばれます。パイプラインを停止したい場合は、できません。あなたは、このような関数を記述する必要があります:

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によって提案されたソリューションを使用するのがより一般的です。

0

私はエリクサー初心者ですので、あまりにも過酷ではありません:)。

なぜこの目的のために匿名関数を使用しないのですか?

model 
|> cast(params, ~w(something), ~w()) 
|> (fn(n) -> conditional && n |> Repo.update || n end).() 
関連する問題