Проверьте ISO8601 start_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)?

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
Другие вопросы по тегам