两个属性之一的 Ecto validate_required

Ecto validate_required of either of two attributes

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

仅当两个属性均未提供时,验证才会失败

例如考虑具有属性 :name, :uid, :email, :phone

的 User 模型

这行得通吗?

  def changeset(struct, params \ %{}) do
    struct
      |> cast(params, [:name,:email,:uid,:phone])
      |> validate_required([:name, :email]) || validate_required([:name, :uid]
    end
  end

您可以从以下内容开始:

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。遇到这种情况怎么办?