验证一个日期是否晚于或相同于另一个日期
Validate than one date is later or same than the other
我想验证 ends_on
总是晚于或与 starts_on
相同的日期。但是我的自定义验证不起作用。这个验证的正确写法是什么?
defmodule Example.Calendar.VacationPeriod do
use Ecto.Schema
import Ecto.Changeset
alias Example.Calendar.VacationPeriod
schema "vacation_periods" do
field :ends_on, :date
field :name, :string
field :starts_on, :date
timestamps()
end
@doc false
def changeset(%VacationPeriod{} = vacation_period, attrs) do
vacation_period
|> cast(attrs, [:name, :starts_on, :ends_on])
|> validate_required([:name, :starts_on, :ends_on])
|> validate_dates_make_sense
end
defp validate_dates_make_sense(changeset) do
starts_on = get_field(changeset, :starts_on)
ends_on = get_field(changeset, :ends_on)
if starts_on > ends_on do
add_error(changeset, :starts_on, "cannot be later than 'ends_on'")
else
changeset
end
end
end
您不能使用比较运算符比较 Date
结构。 Date
模块有一个 compare/2
函数,您可以使用:
if Date.compare(starts_on, ends_on) == :gt do
add_error(changeset, :starts_on, "cannot be later than 'ends_on'")
else
changeset
end
或 case
:
case Date.compare(starts_on, ends_on) do
:gt -> add_error(changeset, :starts_on, "cannot be later than 'ends_on'")
_ -> changeset
end
我想验证 ends_on
总是晚于或与 starts_on
相同的日期。但是我的自定义验证不起作用。这个验证的正确写法是什么?
defmodule Example.Calendar.VacationPeriod do
use Ecto.Schema
import Ecto.Changeset
alias Example.Calendar.VacationPeriod
schema "vacation_periods" do
field :ends_on, :date
field :name, :string
field :starts_on, :date
timestamps()
end
@doc false
def changeset(%VacationPeriod{} = vacation_period, attrs) do
vacation_period
|> cast(attrs, [:name, :starts_on, :ends_on])
|> validate_required([:name, :starts_on, :ends_on])
|> validate_dates_make_sense
end
defp validate_dates_make_sense(changeset) do
starts_on = get_field(changeset, :starts_on)
ends_on = get_field(changeset, :ends_on)
if starts_on > ends_on do
add_error(changeset, :starts_on, "cannot be later than 'ends_on'")
else
changeset
end
end
end
您不能使用比较运算符比较 Date
结构。 Date
模块有一个 compare/2
函数,您可以使用:
if Date.compare(starts_on, ends_on) == :gt do
add_error(changeset, :starts_on, "cannot be later than 'ends_on'")
else
changeset
end
或 case
:
case Date.compare(starts_on, ends_on) do
:gt -> add_error(changeset, :starts_on, "cannot be later than 'ends_on'")
_ -> changeset
end