我只是在为模型提供几个字段时尝试对模型进行一些验证。
就像那样:
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
,因此会引发参数错误,因为
"string" or "string"
返回elixir中的argumenterror。实施not(is_nil(get_field))
使得行长度如此之长(现在甚至很长),所以我对实现此条件验证的干净方式感到好奇。
答案 0 :(得分:2)
您可以使用not(is_nil(_))
代替or
和||
,而nil
将false
和Ecto.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