我今天刚开始使用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在文档中没有太多的帮助,正确的方法是什么?
发布于 2015-02-14 03:58:09
:datetime是的原生Postgres数据类型;该数据类型映射到一个由两个元素组成的Elixir tuple ({{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发布于 2015-03-10 09:14:05
默认字段名称为:inserted_at和:updated_at,但您可以通过传递关键字列表来合并您自己的字段名称
schema "users" do
field :name, :string
field :email, :string
timestamps([{:inserted_at,:created_at}])
end发布于 2015-02-21 07:48:27
您还可以考虑让缺省值不在模式中,而是在迁移中:"created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"
https://stackoverflow.com/questions/28506589
复制相似问题