很简单,我需要禁用特定列的时区转换。我将手动处理任何 TZ 转换,但我需要 Rails 3 来放弃写入和读取的转换,以及任何 AREL 函数。但是,我不想禁用非指定属性的转换。
好的,我知道如何禁用它进行阅读:
self.skip_time_zone_conversion_for_attributes = [:test_timestamp]
但这仅适用于阅读。编写属性时,它仍然转换为 UTC(是的,我在 3.2.8 中对此进行了测试)。
正如您所注意到的,skip_time_zone_conversion_for_attributes
仅适用于阅读,这使得整个功能毫无用处。
有两种可能的解决方案:
1.- 接受时间将以 UTC 书写,并相应地阅读:
def starts_at # override reader method
attributes['starts_at'].in_time_zone(whatever_timezone)
end
缺点: 使用MyModel.pluck(:starts_at).
时
2.- 将时间值存储为字符串,注意以正确的格式写入值,并以所需的时区读取它们。
def starts_at
DateTime.strptime(attributes['starts_at'], whatever_format).in_time_zone(whatever_timezone)
end
缺点:无法使用日期运算符(小于、大于)查询数据库。