首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ecto和Elixir的默认datetime

Ecto和Elixir的默认datetime
EN

Stack Overflow用户
提问于 2015-02-14 02:48:28
回答 3查看 11.9K关注 0票数 9

我今天刚开始使用Elixir & Phoenix,我正在尝试添加Ecto作为映射器,但我在使用时间上遇到了一些问题。

这是我的模型。

代码语言:javascript
复制
  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,但是当我试图编译它时,我得到了以下错误。

代码语言:javascript
复制
== 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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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_atupdated_at字段,让您选择它们应该是什么类型,默认为Ecto.DateTime):

代码语言:javascript
复制
schema "users" do
  field :name, :string
  field :email, :string
  timestamps
end
票数 13
EN

Stack Overflow用户

发布于 2015-03-10 09:14:05

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

代码语言:javascript
复制
schema "users" do
  field :name, :string
  field :email, :string
  timestamps([{:inserted_at,:created_at}])
end
票数 16
EN

Stack Overflow用户

发布于 2015-02-21 07:48:27

您还可以考虑让缺省值不在模式中,而是在迁移中:"created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28506589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档