在 Rails 中,关闭指定列的时区转换



很简单,我需要禁用特定列的时区转换。我将手动处理任何 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

缺点:无法使用日期运算符(小于、大于)查询数据库。

相关内容

  • 没有找到相关文章

最新更新