如果存在两个字段,则进行条件验证

时间:2016-08-20 02:57:35

标签: elixir 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,因此会引发参数错误,因为

"string" or "string"

返回elixir中的argumenterror。实施not(is_nil(get_field))使得行长度如此之长(现在甚至很长),所以我对实现此条件验证的干净方式感到好奇。

1 个答案:

答案 0 :(得分:2)

您可以使用not(is_nil(_))代替or||,而nilfalseEcto.Changeset.get_field视为虚假,其他一切视为真实{{1}永远不会为字符串字段返回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