如果存在几个字段,则进行 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_afield_b存在时,它们returnsstring,所以这里出现参数错误,因为

"string" or "string"

returns 长生不老药中的参数错误。实现 not(is_nil(get_field)) 使行长度如此之长(现在甚至更长),所以我很好奇实现此条件验证的简洁方法。

您可以只使用 || 而不是 not(is_nil(_))or,它将 nilfalse 视为虚假的,而其他所有内容都与 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