Подтвердить, что start_time ISO8601 предшествует end_time ISO8601 в elixir/ecto/timex

Я работаю над запросом json, используя phoenix, где у меня есть start_time и end_time в формате ISO8601, и я хочу проверить, что end_time > start_time, поэтому указано:

 {
    "start_time": "2016-07-07T01:00:00+02:00",
    "end_time": "2016-07-07T01:30:00+01:00"
 }

ошибка проверки должна быть возвращена для обоих полей, говоря, что "start_time": "должно быть меньше, чем end_time" и "end_time": "должно быть больше, чем start_time".

Каков предпочтительный способ добиться этого с помощью наборов изменений экто (+ timex)?


person BurmajaM    schedule 22.04.2016    source источник


Ответы (1)


Вы можете написать свою пользовательскую функцию vadlidate_time_range и использовать ее внутри конвейера в функции changeset. Эти валидаторы должны принимать структуру changeset в качестве первого аргумента и возвращать структуру changeset.

Внутри этой функции вам нужно проверить обе даты. Если они изменились, они будут в changeset.changes. Если нет, вам нужно будет извлечь их из модели. Получить их можно так:

start_time = changeset.changes |> Dict.get(:start_time, nil)
start_time = start_time || (changeset.model |> Dict.get(:start_time))
{:ok, start_time} = Timex.parse start_time, "{ISO:Extended}"

То же самое касается времени окончания, поэтому вы можете захотеть выделить эти три операции в функцию.

Тогда нужно сравнить с Timex.Comparable.compare(start_time, end_time).

case comparison_result do
  1 ->
    changeset
  _ ->
    changeset
    |> add_error(:start_time, "must be less then end_time")
    |> add_error(:end_time, "must be greater than start_time")
end
person tkowal    schedule 23.04.2016
comment
Я закончил тем, что использовал Календарь, но этот был хорошим ориентиром. Спасибо @tkowal - person BurmajaM; 26.04.2016