Rohre sind ideal für Operationen, die nicht fehlschlagen können und alle von ihnen werden immer getragen werden. Falls Sie die Pipeline stoppen möchten, können Sie dies nicht tun. Sie müssten Funktionen schreiben, wie folgt aus:
maybe_repo_update(nil), do: nil
maybe_repo_update(data), do: Repo.update(data)
Um dieses Problem zu lösen, gibt es eine neue spezielle Form in Elixir 1.2 with
genannt wird. Es kann im Moment um die Pipeline zu stoppen, wo etwas nicht mit:
with changeset <- cast(model, params, ~w(something), ~w())
{:ok, changeset} <- conditional_operation(changeset)
{:ok, model} <- Repo.insert(changeset)
Dadurch wird sichergestellt, dass, wenn bedingte Operation etwas anderes als {:ok, changeset}
zurück wird es nicht versuchen, den letzten Repo-Einsatz laufen. In Elixir 1.3 können Sie auch else
Teil verwenden.
jedoch für Changesets ist es häufiger Lösung von @JustMichael vorgeschlagen zu verwenden:
def conditional(changeset) do
if something_to_do do
transform(changeset)
else
changeset
end
end
Diese Lösung wird den Repo.update
Teil immer laufen.
Also ist 'conditional' entweder eine Funktion oder keine? – Dogbert
Ja !!!!!!!!!!!! – asiniy