elixir - 验证一个日期比另一个日期晚或相同

标签 elixir phoenix-framework ecto

我想验证 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

关于elixir - 验证一个日期比另一个日期晚或相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281493/

相关文章:

elixir - 为 Elixir 设置 WebStorm(项目 SDK 未定义)

elixir - 模块 Bcrypt.Base 不可用

erlang - channel 上的持久消息

elixir - 在 Phoenix 中处理嵌套表单/ecto 变更集的正确方法是什么?

testing - Phoenix 丹药 : mock internal functions

elixir - 为什么此代码因 Ecto.NoPrimaryKeyValueError 而失败

elixir - 如何在 Elixir 中制作具有开始、长度和增量的整数列表?

string - 如何在 Elixir 中轻松获取第 n 个字符串字符?

elixir - 无法连接 : ** (Postgrex. 错误)致命(invalid_catalog_name):数据库 "api_example_dev"不存在

elixir - 无法在 Phoenix 中创建嵌套资源