Дата и время по умолчанию с Ecto & Elixir

Я только начал работать с Elixir & Phoenix сегодня, я пытаюсь добавить Ecto в качестве картографа, но у меня проблемы с использованием времени.

Это моя модель.

  schema "users" do
    field :name, :string
    field :email, :string
    field :created_at, :datetime, default: Ecto.DateTime.local
    field :updated_at, :datetime, default: Ecto.DateTime.local
  end

Я пытаюсь установить created_at и updated_at по умолчанию, но когда я пытаюсь скомпилировать это, я получаю следующую ошибку.

== Compilation error on file web/models/user.ex ==
** (ArgumentError) invalid default argument `%Ecto.DateTime{day: 13, hour: 19, min: 47, month: 2, sec: 12, year: 2015}` for `:datetime`
lib/ecto/schema.ex:687: Ecto.Schema.check_default!/2
lib/ecto/schema.ex:522: Ecto.Schema.__field__/4
web/models/board.ex:9: (module)
(stdlib) erl_eval.erl:657: :erl_eval.do_apply/6

В документации не так много помощи, как это сделать правильно?


person MartinElvar    schedule 13.02.2015    source источник
comment
Обратите внимание, что default: Ecto.DateTime.local будет расширен во время компиляции, чего вы не хотите. Как сказал @whatyouhide, используйте вместо этого Ecto.Schema.timestamps/1.   -  person José Valim    schedule 14.02.2015
comment
Как и где мне указать использование Ecto.Schema.timestamps / 1? Полагаю, я не собираюсь указывать это как поле, поскольку оно создает сами поля?   -  person MartinElvar    schedule 14.02.2015
comment
@whatyouhide Опять спасибо! Я должен тебя обнять :-)   -  person MartinElvar    schedule 14.02.2015


Ответы (3)


:datetime - это собственный тип данных Postgres, а также datetime; этот тип данных отображается на двухэлементный кортеж Elixir ({{yy, mm, dd}, {hh, mm, ss}}). Структура %Ecto.DateTime{} не является двухэлементным кортежем, отсюда и ошибка компиляции.

Вы можете установить тип своих полей на Ecto.DateTime, все должно работать без проблем.

Здесь находится соответствующая документация о примитивных и непримитивных типах.

PS вы также можете посмотреть Ecto.Schema.timestamps/1, который - это макрос, который расширяется в основном до того, что вы написали вручную (он добавляет поля created_at и updated_at, и позволяет вам выбрать, какой тип они должны быть, по умолчанию Ecto.DateTime):

schema "users" do
  field :name, :string
  field :email, :string
  timestamps
end
person whatyouhide    schedule 13.02.2015
comment
Спасибо, очень признателен. - person MartinElvar; 13.02.2015
comment
@MartinElvar, без проблем! - person whatyouhide; 13.02.2015
comment
Временные метки FWIW не добавляют в него объявления created_at и updated_at, вставленные и обновленные source - person engineerDave; 21.11.2015

Имена полей по умолчанию - :inserted_at и :updated_at, но вы можете объединить их с собственными именами полей, передав список ключевых слов.

schema "users" do
  field :name, :string
  field :email, :string
  timestamps([{:inserted_at,:created_at}])
end
person misaelpc    schedule 10.03.2015
comment
Как переопределить: update_at? Мне не нужно: update_at в моей таблице, но эти временные метки ищут столбцы update_at. - person Tahmina Khatoon; 05.09.2016
comment
Вы можете переопределить этот столбец, передав false в качестве параметра в параметрах, например: timestamps(updated_at: false) - person ontek; 02.10.2016

Вы также можете подумать о том, чтобы значение по умолчанию было не в схеме, а в миграции: "created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"

person G Amini    schedule 20.02.2015