2016-08-20 44 views
0

我想实现一些验证的模型,只有当两个字段为模型呈现。Ecto条件验证,如果两个字段存在

就像是:

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

的问题是:当field_afield_b目前,他们返回string,这样的说法错误在这里提出,becauase

"string" or "string" 

回报引发ArgumentError的灵药。实现not(is_nil(get_field))使行长度如此长(现在甚至更长),所以我很好奇实现这种条件验证的干净方式。

回答

2

代替not(is_nil(_))or,你可以只使用||它把nilfalse为falsy和一切为truthy为Ecto.Changeset.get_field从来不会给一个字符串字段返回false

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

如果你有Ecto.Changeset已经进口(在菲尼克斯机型中默认进口),您可以删除Changeset.

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

我以前并不知道这个'''vs'或'特性。谢谢! – asiniy