如果存在几个字段,则进行 Ecto 条件验证
Ecto conditional validation if couple of fields present
我正在尝试仅在模型存在几个字段时才对模型实施一些验证。
像那样:
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
存在时,它们returnsstring
,所以这里出现参数错误,因为
"string" or "string"
returns 长生不老药中的参数错误。实现 not(is_nil(get_field))
使行长度如此之长(现在甚至更长),所以我很好奇实现此条件验证的简洁方法。
您可以只使用 ||
而不是 not(is_nil(_))
和 or
,它将 nil
和 false
视为虚假的,而其他所有内容都与 Ecto.Changeset.get_field
永远不会 return 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
(它们在 Phoenix 模型中默认导入),您可以删除 Changeset.
:
if get_field(changeset, :field_a) || get_field(changeset, :field_b) do
changeset
|> a_lot_of_validations
else
changeset
end
我正在尝试仅在模型存在几个字段时才对模型实施一些验证。
像那样:
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
存在时,它们returnsstring
,所以这里出现参数错误,因为
"string" or "string"
returns 长生不老药中的参数错误。实现 not(is_nil(get_field))
使行长度如此之长(现在甚至更长),所以我很好奇实现此条件验证的简洁方法。
您可以只使用 ||
而不是 not(is_nil(_))
和 or
,它将 nil
和 false
视为虚假的,而其他所有内容都与 Ecto.Changeset.get_field
永远不会 return 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
(它们在 Phoenix 模型中默认导入),您可以删除 Changeset.
:
if get_field(changeset, :field_a) || get_field(changeset, :field_b) do
changeset
|> a_lot_of_validations
else
changeset
end