2017-09-28 1 views
1

Dans mon application Phoenix, j'essaie d'insérer un enregistrement d'événement dans la base de données avec des champs pour start_time et end_time - les données datetime seront déjà converties en format de chaîne ISO sur le client et transmis à l'API Phoenix en tant que données JSON, mais cela me cause quelques problèmes quand j'essaye de faire un insert - le modèle attend que ces valeurs soient :utc_datetime alors j'ai besoin de les convertir - j'ai lu la documentation, mais je ne suis toujours pas sûr ...Phoenix/Ecto - convertir une chaîne ISO en type primitif utc_datetime

Tout d'abord, voici le schéma pour le modèle:

@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 

données JSON du client ressemblerait à ceci:

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

Et si je devais (à tort) essayer d'insérer ces données en l'état, la déclaration ressemblerait à ceci:

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"}) 

Comme prévu , cela génère une erreur que mes données datetime does not match type :utc_datetime. Ok, c'est cool, mais ma question est, avec les données déjà dans la chaîne ISO, comment puis-je le convertir en Elixir/Ecto le reconnaît comme valide :utc_datetime?

Répondre

2

Vous voulez un struct DateTime pour votre champ :utc_datetime, comme vous pouvez le voir dans les docs ici: https://hexdocs.pm/ecto/Ecto.Schema.html#module-primitive-types

Vous pouvez obtenir un DateTime d'une chaîne iso comme celui que vous aviez ci-dessus comme ceci:

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

(le zéro dans le tuple est l'UTC offset)

note: le support pour les types de calendrier Elixir a été introduit en Ecto 2.1. DateTime.from_iso8601/1 a été introduit dans Elixir 1.4.