【问题标题】:Rails postgres Time attribute not savingRails postgres时间属性不保存
【发布时间】:2020-12-30 03:49:18
【问题描述】:

我要疯了吗? time 属性在保存活动记录对象后失去其值并重置为 2000 年 1 月 1 日。数据库是 Postgres。 Rails 5.2 和 pg gem 1.1.3

2.6.6 :019 > obj.end_time = Date.new(2019, 9,9)
 => Mon, 09 Sep 2019 
2.6.6 :020 > obj.save
 => true 
2.6.6 :021 > obj.end_time
 => Mon, 09 Sep 2019 00:00:00 UTC +00:00 
2.6.6 :022 > obj.end_time.class
 => ActiveSupport::TimeWithZone 

但是现在如果我从数据库重新加载,值会被重置:

2.6.6 :023 > obj.reload
2.6.6 :024 > obj.end_time
 => Sat, 01 Jan 2000 00:00:00 UTC +00:00
2.6.6 :025 > obj.end_time.class
 => ActiveSupport::TimeWithZone 

postgres 列类型在 psql 中显示为“没有时区的时间”。如果我想设置日期部分,我想我只需要在迁移中指定日期时间而不是时间?

我尝试在迁移change_column :school_courses, :start_time, :datetime 中更改列类型,但得到:

PG::DatatypeMismatch:错误:列“start_time”无法转换 自动键入没有时区的时间戳提示:您可能 需要指定“USING start_time::timestamp without time zone”

不知道怎么做

【问题讨论】:

  • 我无法使用基本模型重现此问题,您是否在模型类中执行了可能会影响此的操作?
  • 必须与 Postgres 中的列类型有关。我在模型中什么都没有,它正在其他地方发生。将尝试检查 psql
  • 那么它对您发布模型和 postgres 表定义 (DDL) 会有所帮助。
  • 在 Rails 中,模式只是表示列的“时间”。正如我所提到的,在表上的 psql 中运行 \d 会将列类型设置为“没有时区的时间”。您是否推荐了另一个 psql 命令可以提供更多信息?
  • @rigyt 您能否发布您如何编写工作迁移(解决方案)?

标签: ruby-on-rails postgresql timezone


【解决方案1】:

使用datetime 列类型来保存日期和时间 如果您不需要日期,请仅在迁移中使用time(只想存储时间部分)

无论如何,postgres 就是这种情况

迁移示例:

create_table "school_years" do |t|
    t.integer "year"
    t.integer "minimum_candidates_per_exam"
    t.time "am_start_time"
    t.time "pm_start_time"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

虽然我一般只使用datetime并设置年份部分,避免使用time

【讨论】:

  • 感谢您的回复。您是否曾经使用 USING 关键字在迁移本身中使用描述的提示“提示:您可能需要指定“USING start_time::timestamp without time zone””?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多