使用Ecto和Elixir的默认日期时间[英] Default datetime with Ecto & Elixir

本文是小编为大家收集整理的关于使用Ecto和Elixir的默认日期时间的处理方法,想解了使用Ecto和Elixir的默认日期时间的问题怎么解决?使用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

我正在尝试设置create_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数据类型,适用于DateTime;此数据类型将其映射到两个元素Elixir Tuple({{yy, mm, dd}, {hh, mm, ss}}). %Ecto.DateTime{} struct不是两个元素元组,因此编译误差.

您可能需要将字段的类型设置为Ecto.DateTime,它都应该无缝工作.

在这里是有关原始类型和非主要类型的相关文档.

ps 您也可能想看看 Ecto.Schema.timestamps/1 Ecto.Schema.timestamps/1 ,这是宏,它基本上是您手动编写的(它添加created_at和updated_at字段,它让您选择它们​​应该是哪种类型,默认为Ecto.DateTime):

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

其他推荐答案

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

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

其他推荐答案

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

本文地址:https://www.itbaoku.cn/post/1763748.html