【发布时间】:2014-01-07 10:35:24
【问题描述】:
我正在尝试将所有时间戳存储在包含时区的 rails 应用程序中。我对 ActiveRecord 将它们转换为 utc 没问题,但是我有多个应用程序访问同一个数据库,其中一些是根据时区要求实现的。所以我想要做的是让 activerecord 像往常一样转换我的时间戳,然后将它们写入数据库,并将字符串“America/Los_Angeles”或任何适当的时区附加到时间戳。我目前在 jruby 1.7.8 上运行 rails 3.2.13,它实现了 ruby 1.9.3 api。我的数据库是 postgres 9.2.4,与 activerecord-jdbcpostgresql-adapter gem 连接。列类型为带时区的时间戳。
我已经使用 activerecord-native_db_types_override gem 更改了自然的 activerecord 映射,方法是将以下几行添加到我的 environment.rb 中:
NativeDbTypesOverride.configure({
postgres: {
datetime: { name: "timestamp with time zone" },
timestamp: { name: "timestamp with time zone" }
}
})
我的 application.rb 当前包含
config.active_record.default_timezone = :utc
config.time_zone = "Pacific Time (US & Canada)"
我怀疑我可以重写 ActiveSupport::TimeWithZone.to_s 并更改它的 :db 格式以输出正确的字符串,但我还不能完成这项工作。非常感谢任何帮助。
【问题讨论】:
-
为什么不将它们处理/存储为“带时区的时间戳”(utc)并设置 pg-client 时区,以便它返回您想要的格式?
-
你可以设置 postgres 来做这个吗?如果是这样的话,这将适用于我的目的,但它们需要与附加的 UTC 时区一起存储。
-
据我所知,您无法在进入数据库的过程中自动转换。我认为这无论如何都不可行,因为它还会自动转换连接到数据库的其他应用程序的时间戳,这可能是他们期望的,也可能是不期望的。
标签: ruby-on-rails ruby ruby-on-rails-3 postgresql activerecord