2

很简单,我需要禁用特定列的时区转换。我将手动处理任何 TZ 转换,但我需要 Rails 3 来放弃写入读取以及任何 AREL 功能的转换。但是,我不想禁用非指定属性的转换。

好的,我知道如何禁用它以供阅读:

self.skip_time_zone_conversion_for_attributes = [:test_timestamp]

但这仅适用于阅读。编写属性时,它仍然转换为 UTC(是的,我在 3.2.8 中对此进行了测试)。

4

1 回答 1

0

正如您所注意到的,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

缺点:失去使用日期运算符(小于、大于)查询数据库的能力。

于 2016-02-07T01:54:55.453 回答