2016-04-22 688 views
0

我使用的是鳳凰在那裏我有ISO8601格式START_TIME和END_TIME,我想驗證END_TIME對JSON請求工作是> START_TIME,所以給出:驗證ISO8601 START_TIME是在ISO8601 END_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」。

什麼是使用ecto變更集(+ 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 
+0

我已經結束了使用日曆,但這是一個很好的指導方針。謝謝@tkowal – BurmajaM