Rails为什么不返回TimeWithZone范围?

时间:2019-08-07 10:27:27

标签: ruby-on-rails

在Rails 6应用中,我具有reserved_between tsrange属性。

在PostgreSQL中,这些值存储为UTC(在这里没有问题),现在我试图将它们本地化为其他时区,但是在我看来,这种转换无效。

这里有一个小脚本来演示它。

p "UTC: #{Reservation.first.reserved_time}"
Time.use_zone('Europe/Rome') do
  p "ROME: #{Reservation.first.reserved_time}"
end 

应该提取哪个值["2019-08-05 15:28:03.443474","2019-08-05 15:58:03.443487"]

"UTC: 2019-08-05 15:28:03 UTC..2019-08-05 15:58:03 UTC"
"ROME: 2019-08-05 17:28:03 CEST +02:00..2019-08-05 17:58:03 CEST +02:00"

但实际上会打印出

"UTC: 2019-08-05 15:28:03 UTC..2019-08-05 15:58:03 UTC"
"ROME: 2019-08-05 15:28:03 UTC..2019-08-05 15:58:03 UTC"

我在Rails Github存储库https://github.com/rails/rails/issues/21116上发现了一个老问题,但似乎已经在https://github.com/rails/rails/commit/302e92359cc88258ae15a82454c58408a4b8157e上修复了

但不幸的是

  

...这不会自动使时区识别范围,...

那么,如何获得Range的{​​{1}}而不是ActiveSupport::TimeWithZone的{​​{1}}?

1 个答案:

答案 0 :(得分:0)

您可以尝试覆盖reserved_time上的Reservation阅读器,将Range转换为TimeWithZone

    def reserved_time
      range = read_attribute(:reserved_time)
      (range.begin.in_time_zone..range.end.in_time_zone)
    end