2017-09-18 6 views
2

ends_onは常に遅いか、同じ日付がstarts_onであることを検証したいと思います。しかし、私のカスタム検証は機能しません。この検証を書く正しい方法は何ですか?1つの日付が他の日付よりも遅いか同じであることを確認してください

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 

答えて

3

比較演算子を使用してDate構造体を比較することはできません。

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 
Dateモジュールは、あなたが使用することができます compare/2機能を持っています
関連する問題