Ecto validate_required两个属性中的任何一个

时间:2016-07-27 01:12:31

标签: ecto

对变更集的两个属性的存在进行验证的最佳方法是什么?

如果两个属性都没有提供,则验证应该失败

e.g。考虑具有属性的用户模型:name,:uid,:email,:phone

  • :名称始终需要存在
  • :电子邮件或:uid应该出现
  • :手机是可选的

这会有用吗?

{2, 3, 5, 7, 11, 13, 17, 19}

1 个答案:

答案 0 :(得分:5)

您可以从以下内容开始:

def changeset(struct, params \\ %{}) do
  struct
    |> cast(params, ~w(name email uid phone)a)
    |> validate_required(:name)
    |> validate_required_params(params)
  end
end

def validate_required_params(changeset, %{"uid" => _}) do
  changeset
  |> validate_required(:uid)
end

def validate_required_params(changeset, %{"email" => _}) do
  changeset
  |> validate_required(:email)
end

def validate_required_params(changeset, _params) do
  changeset
  |> add_error(:params, "either :uid or :email is required")
end

但您还需要检查是否提供了uidemail。在这种情况下是什么?