Проверьте 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