9

我今天刚刚开始使用 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

在文档中没有太多帮助,正确的方法是什么?

4

3 回答 3

16

默认字段名称是 :inserted_at:updated_at但您可以与自己的字段名称合并,传递关键字列表

schema "users" do
  field :name, :string
  field :email, :string
  timestamps([{:inserted_at,:created_at}])
end
于 2015-03-10T01:14:05.327 回答
13

:datetime是日期时间的本地 Postgres 数据类型;此数据类型映射到一个包含两个元素的 Elixir 元组 ( {{yy, mm, dd}, {hh, mm, ss}})。%Ecto.DateTime{}结构不是两个元素的元组,因此会出现编译错误。

您可能希望将字段的类型设置为Ecto.DateTime,它应该都能无缝工作。

是有关原始类型和非原始类型的相关文档。

PS您可能还想看一下Ecto.Schema.timestamps/1,它是一个宏,基本上可以扩展为您手动编写的内容(它添加了created_atandupdated_at字段,让您选择它们​​应该是什么类型,默认为Ecto.DateTime):

schema "users" do
  field :name, :string
  field :email, :string
  timestamps
end
于 2015-02-13T19:58:09.473 回答
5

您还可以考虑让默认值不在架构中,而是在迁移中:"created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"

于 2015-02-20T23:48:26.527 回答