这是我第一次尝试使用PostgreSQL创建Rails。我感到困惑的是我在通常看到的关于存储绝对时间的列的代码中缺少timestamp with timezone
用法。一个主要的例子是devise,它在列中存储了一个datetime列,该列转换为PostgreSQL中的timestamp with out timezone
。
我认为这是一种不好的做法,因为timestamp with out timezone
可能意味着任何时区。如果您从另一个应用程序访问数据库,那么在没有查看Rails的情况下,您将不知道时间戳引用的时区。它只是一个分散的混乱。
我有什么方法可以在PostgreSQL的ActiveRecord迁移/架构中创建timestamp with time zone
吗?是否会与当前的Rails框架代码产生不兼容问题?
我理解ActiveRecord试图与数据库无关,但这只是一个我不能忽视的宠儿。
答案 0 :(得分:2)
我建议看看这个答案(非常好的解释):Ignoring timezones altogether in Rails and PostgreSQL
<强>更新强>
根据ActiveRecord文档,上面的链接和我自己的测试 - 我得出结论,模式迁移中的默认ActiveRecord datetime
和timestamp
列类型无法修改以强制PostgreSQL使用{{ 1}}。
PostgreSQL文档:
注意:SQL标准要求只写时间戳 相当于没有时区的时间戳,PostgreSQL也是如此 行为。 (7.3之前的版本将其视为时间戳的时间戳 zone。)timestamptz被接受为timestamp的缩写 时区;这是一个PostgreSQL扩展。
http://www.postgresql.org/docs/9.1/static/datatype-datetime.html
答案 1 :(得分:0)
我们可以使用this gem覆盖配置并使用特定于Adapter的数据类型。