很简单,我需要禁用特定列的时区转换。我将手动处理任何 TZ 转换,但我需要 Rails 3 来放弃写入和读取以及任何 AREL 功能的转换。但是,我不想禁用非指定属性的转换。
好的,我知道如何禁用它以供阅读:
self.skip_time_zone_conversion_for_attributes = [:test_timestamp]
但这仅适用于阅读。编写属性时,它仍然转换为 UTC(是的,我在 3.2.8 中对此进行了测试)。
很简单,我需要禁用特定列的时区转换。我将手动处理任何 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
缺点:失去使用日期运算符(小于、大于)查询数据库的能力。