2016-08-20 10 views
0

私はモデルのいくつかの検証がモデルのいくつかのフィールドに存在する場合にのみ実装しようとしています。そのようなフィールドのいくつかが存在する場合のエクタ条件付きの検証

if Changeset.get_field(changeset, :field_a) or Changeset.get_field(changeset, :field_b) do 
    changeset 
    |> a_lot_of_validations 
else 
    changeset 
end 

問題がある:field_aまたはfield_b存在は、彼らはstring返すので、引数エラーが万能薬で例外ArgumentError

"string" or "string" 

戻りbecauase、ここで提起されたとき。 not(is_nil(get_field))を実装すると、行の長さが長くなりすぎます(これは今でも長くなっています)。したがって、この条件付き検証を実装するきれいな方法が不思議です。

答えて

2
代わり not(is_nil(_))

or、あなただけの扱い||を使用することができますnilfalseなどfalsyと文字列フィールドのfalseを返すことはありませんEcto.Changeset.get_fieldとしてtruthyとして他のすべて:あなたはすでにEcto.Changesetを持っている場合は

if Changeset.get_field(changeset, :field_a) || Changeset.get_field(changeset, :field_b) do 
    changeset 
    |> a_lot_of_validations 
else 
    changeset 
end 

インポート済み(デフォルトでフェニックスモデルにインポートされます)、Changeset.を削除できます。

if get_field(changeset, :field_a) || get_field(changeset, :field_b) do 
    changeset 
    |> a_lot_of_validations 
else 
    changeset 
end 
+0

私は前にこの '||' vs 'または' '特異性を知りませんでした。ありがとう! – asiniy

関連する問題