使用Ecto和Elixir的默认日期时间

Mar*_*var 8 postgresql elixir ecto

我今天刚刚开始使用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
Run Code Online (Sandbox Code Playgroud)

我试图在默认情况下设置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
Run Code Online (Sandbox Code Playgroud)

获取文档没有太大帮助,这样做的正确方法是什么?

小智 16

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

schema "users" do
  field :name, :string
  field :email, :string
  timestamps([{:inserted_at,:created_at}])
end
Run Code Online (Sandbox Code Playgroud)


wha*_*ide 12

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

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

以下是有关基本类型和非基本类型的相关文档.

PS你可能也想看看Ecto.Schema.timestamps/1,这是宏扩展到基本上你手动写的东西(它添加created_atupdated_at字段,它让你选择它们应该是什么类型,默认为Ecto.DateTime):

schema "users" do
  field :name, :string
  field :email, :string
  timestamps
end
Run Code Online (Sandbox Code Playgroud)


G A*_*ini 5

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