2017-07-13 7 views
0

In einer Phoenix App möchte ich einen Sitzungsdatensatz in einer Postgres DB speichern, wobei das Feld expires in 12 Stunden ist. Meine Sitzung Modell setzt die verfällt Feld als Ecto.DateTime.Elixir - Ecto.DateTime kann nicht in Postgres-Datenbank gespeichert werden, wo Ecto.Date funktioniert

Modell

schema "sessions" do 
 
    field :key, :string 
 
    field :expires, Ecto.DateTime 
 
    field :user_id, :integer 
 

 
    timestamps() 
 
    end

Wenn die Authentifizierung in dem Login-Controller erfolgreich ist, I das Sitzungsobjekt konstruieren und sie dieerstellen Funktion im Sitzungssteuerung senden. Timex wird verwendet, um die Zeit in 12 Stunden zu bestimmen.

Anmeldung Controller-

{:ok, session_expiry} = Ecto.DateTime.cast(Timex.to_datetime(Timex.shift(Timex.now, hours: 12))) 
 
# Returns {:ok, #Ecto.DateTime<2017-07-13 20:56:25.969059>} 
 
    session_object = %{ 
 
     "key" => encrypted_auth_code, 
 
     "expires" => session_expiry, 
 
     "user_id" => user_id 
 
    } 
 
    SessionController.create(%{"data" => data = %{"type" => "session", "attributes" => session_object}})

Session Controller

def create(%{"data" => data = %{"type" => "session", "attributes" => _session_params}}) do 
 
    changeset = Session.changeset(%Session{}, Params.to_attributes(data)) 
 
    IO.inspect _session_params 
 
    case Repo.insert(changeset) do 
 
     {:ok, session} -> 
 
     IO.puts "success" 
 
     {:error, changeset} -> 
 
     IO.puts "failure" 
 
    end 
 
    end

In Sitzungssteuerung die Linie case Repo.insert(changeset) do die folgenden Fehler führt:

no function clause matching in Ecto.Adapters.Postgres.DateTime.encode_date/1

Wenn ich die Art der abläuft Feld in der Sitzung Modell Ecto.Date der Datenbank-Datensatz erfolgreich erstellt wird ändern, aber ohne die Zeit.

Was muss ich ändern, um in einem Ecto.DateTime Feld in der DB zu speichern?

+1

Was ist der Typ der 'expires' Spalte in Ihrer Datenbank (oder Migration)? Vielleicht haben Sie den Typ "Datum" anstelle von "DatumZeit" in der Migration verwendet? – Dogbert

+0

habe ich! Vielen Dank. Das Feld 'expires' wurde geändert, um' 'timestamp'' einzugeben, und es funktioniert jetzt einwandfrei. – AJP

Antwort

2

Wenn Ecto.Date den Typ des Feldes in der Datenbank funktioniert, ist wahrscheinlich date statt utc_datetime (timestamp in PostgreSQL). Ändern Sie es zu utc_datetime sollte den Fehler beheben. Wenn Sie Migrationen verwendet haben, um die Tabelle zu erstellen, können Sie eine neue erstellen, die den Typ der Spalte wie folgt ändert:

def up do 
    alter table(:sessions) do 
    modify :expires, :utc_datetime 
    end 
end 

def down do 
    alter table(:sessions) do 
    modify :expires, :date # old type here 
    end 
end 
Verwandte Themen