2017-09-28 8 views
1

Phoenixアプリケーションで、start_timeおよびのフィールドを持つデータベースにイベントレコードを挿入しようとしています。datetimeデータはすでにISO文字列形式に変換されていますJSONデータとしてPhoenix APIに渡されましたが、挿入しようとするといくつかの問題が発生します。これらの値は:utc_datetimeであると予測していますので、変換する必要があります。私はまだわからないんだけど...Phoenix/Ecto - ISO文字列をutc_datetimeプリミティブ型に変換する

まず第一に、ここではモデルのスキーマです:

@primary_key {:id, :string, []} 
@derive {Phoenix.Param, key: :id} 
schema "calendar_event" do 
    field :start_time, :utc_datetime 
    field :end_time, :utc_datetime 
    field :description, :string 

    timestamps() 
end 
クライアントからの

JSONデータは次のようになります。予想通り

MyApp.Repo.insert(%MyApp.CalendarEvent{id: "calendar_event:test1", start_time: 
"2017-09-28T18:31:32.223Z", end_time: "2017-09-28T19:31:32.223Z", 
description: "Test insert"}) 

{ 
    "start_time": "2017-09-28T18:31:32.223Z", 
    "end_time": "2017-09-28T19:31:32.223Z", 
    "description": "Test insert" 
} 

そして、私がした場合(誤っ) - であるとして、このデータを挿入しようと、声明は次のようになります。これは、私の日時データdoes not match type :utc_datetimeがエラーをスローします。さて、それは素晴らしいですが、私の質問は、すでにISO文字列のデータで、どのように私はそれをElixir/Ectoが有効な:utc_datetimeと認識するように変換できますか?

答えて

2

あなたがここにドキュメントで見ることができるようあなたは、あなたの:utc_datetimeフィールドのDateTime構造体をしたい:https://hexdocs.pm/ecto/Ecto.Schema.html#module-primitive-types

あなたは上記のようななかったようなイソ文字列からDateTimeを得ることができます。

iex> {:ok, dt, 0} = DateTime.from_iso8601("2017-09-28T18:31:32.223Z") 
iex> dt 
#DateTime<2017-09-28 18:31:32.223Z> 

(タプルのゼロはUTCオフセットです)

注:Ecto 2.1ではElixirカレンダーのサポートが導入されました。 DateTime.from_iso8601/1をエリキシル1.4に導入した。

関連する問題