Ecto 和 Elixir 的默认日期时间
Default datetime with 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
获取文档帮助不大,正确的方法是什么?
:datetime
是本机 Postgres 数据类型,以及日期时间;此数据类型映射到一个双元素 Elixir 元组 ({{yy, mm, dd}, {hh, mm, ss}}
)。 %Ecto.DateTime{}
结构不是二元组,因此会出现编译错误。
您可能希望将字段类型设置为 Ecto.DateTime
,它应该可以无缝运行。
Here是原始类型和非原始类型的相关文档。
PS 你可能还想看看 Ecto.Schema.timestamps/1
,这是一个扩展到基本上你手动编写的内容的宏(它添加了created_at
和 updated_at
字段,它让你选择它们应该是什么类型,默认为 Ecto.DateTime
):
schema "users" do
field :name, :string
field :email, :string
timestamps
end
您还可以考虑让默认值不在架构中,而是在迁移中:"created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"
默认字段名称为 :inserted_at
和 :updated_at
,但您可以与自己的字段名称合并,传递关键字列表
schema "users" do
field :name, :string
field :email, :string
timestamps([{:inserted_at,:created_at}])
end
我今天才开始使用 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
获取文档帮助不大,正确的方法是什么?
:datetime
是本机 Postgres 数据类型,以及日期时间;此数据类型映射到一个双元素 Elixir 元组 ({{yy, mm, dd}, {hh, mm, ss}}
)。 %Ecto.DateTime{}
结构不是二元组,因此会出现编译错误。
您可能希望将字段类型设置为 Ecto.DateTime
,它应该可以无缝运行。
Here是原始类型和非原始类型的相关文档。
PS 你可能还想看看 Ecto.Schema.timestamps/1
,这是一个扩展到基本上你手动编写的内容的宏(它添加了created_at
和 updated_at
字段,它让你选择它们应该是什么类型,默认为 Ecto.DateTime
):
schema "users" do
field :name, :string
field :email, :string
timestamps
end
您还可以考虑让默认值不在架构中,而是在迁移中:"created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"
默认字段名称为 :inserted_at
和 :updated_at
,但您可以与自己的字段名称合并,传递关键字列表
schema "users" do
field :name, :string
field :email, :string
timestamps([{:inserted_at,:created_at}])
end