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?
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
habe ich! Vielen Dank. Das Feld 'expires' wurde geändert, um' 'timestamp'' einzugeben, und es funktioniert jetzt einwandfrei. – AJP