两个属性之一的 Ecto validate_required
Ecto validate_required of either of two attributes
验证变更集的两个属性是否存在的最佳方法是什么?
仅当两个属性均未提供时,验证才会失败
例如考虑具有属性 :name, :uid, :email, :phone
的 User 模型
- :姓名必须始终存在
- 应存在 :email 或 :uid
- :phone 可选
这行得通吗?
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
但是您还需要检查例如是否同时提供了 uid
和 email
。遇到这种情况怎么办?
验证变更集的两个属性是否存在的最佳方法是什么?
仅当两个属性均未提供时,验证才会失败
例如考虑具有属性 :name, :uid, :email, :phone
的 User 模型- :姓名必须始终存在
- 应存在 :email 或 :uid
- :phone 可选
这行得通吗?
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
但是您还需要检查例如是否同时提供了 uid
和 email
。遇到这种情况怎么办?