【问题标题】:Default datetime with Ecto & ElixirEcto 和 Elixir 的默认日期时间
【发布时间】:2015-02-13 18:48:28
【问题描述】:

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

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

【问题讨论】:

  • 请注意,default: Ecto.DateTime.local 将在编译时扩展,这不是您想要的。正如@whatyouhide 所说,请改用Ecto.Schema.timestamps/1
  • 我将如何以及在何处指定使用 Ecto.Schema.timestamps/1?我想我不会把它说成一个字段,因为它会自己创建字段?
  • @whatyouhide 再次感谢!我欠你一个拥抱:-)

标签: postgresql elixir ecto


【解决方案1】:

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

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

【讨论】:

  • 如何覆盖:update_at?我不需要 :update_at 在我的表中,但这个时间戳会查找 'update_at' 列。
  • 您可以通过在选项中将 false 作为参数传递来覆盖该列,例如:timestamps(updated_at: false)
【解决方案2】:

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

您可能希望将字段类型设置为Ecto.DateTime,它应该可以无缝运行。

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

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

schema "users" do
  field :name, :string
  field :email, :string
  timestamps
end

【讨论】:

  • 谢谢,非常感谢。
  • @MartinElvar 没问题!
  • FWIW 时间戳不添加 created_at 和 updated_at 它广告 insert_at 和 updated_at source
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多