无法获得active_record.time_zone_aware_attributes和skip_time_zone_conversion_for_attributes

问题描述 投票:1回答:1

我似乎无法在我的Rails 5应用程序中使用skip_time_zone_conversion_for_attributes或active_record.time_zone_aware_attributes

在我的application.rb我有

config.active_record.default_timezone = :local
config.active_record.time_zone_aware_attributes = false

在我的模型中,我有

self.skip_time_zone_conversion_for_attributes = [:start_date, :end_date]

然而,当统计日期和结束日期作为JSON发送回客户端时,它们总是被转换为客户端时区。我不希望这样,因为我需要向客户端显示服务器时间。

为什么这不起作用?我是否需要执行其他操作以确保模型中的start_date和end_date不会转换为用户时区?

谢谢

activerecord ruby-on-rails-5
1个回答
0
投票

这是因为铁轨有几处陷阱。最重要的是因为Time.now和Time.current是完全不同的东西。

config.time_zone = 'Berlin' # Your local time zone
config.active_record.default_timezone = :local
config.active_record.time_zone_aware_attributes = false

这是application.rb中存在的字段,可以使所有模型的时间相关属性生效。

例如 - 如果您没有提及任何time_zone,那么默认情况下它将采用'UTC'

post = Post.create
post.created_at # => Mon, 22 Apr 2019 06:43:08 UTC +00:00 

Time.current # => Mon, 22 Apr 2019 06:43:35 UTC +00:00 
Time.now # => 2019-04-22 12:13:40 +0530 

在您的数据库中,Time.current显示“UTC”格式,但Time.now正在选择您当地的时区。

现在,如果你改变time_zone,

config.time_zone = 'Berlin'

然后,

post = Post.create
post.created_at # => Mon, 22 Apr 2019 08:45:48 CEST +02:00 

Time.current # => Mon, 22 Apr 2019 08:46:05 CEST +02:00 
Time.now # => 2019-04-22 12:16:00 +0530 

现在在您的数据库中,created_at值以“UTC”时区存储,但是当您检索该字段时,它以set time_zone格式显示在'Berlin'中。但是你的Time.now仍然在你当地的时区。

现在按照你的问题我使用skip_time_zone_conversion_for_attributes,并用time_zone改变我的模型是'柏林'

class Post < ActiveRecord::Base
  self.skip_time_zone_conversion_for_attributes = [:created_at]
end

然后,


post = Post.create
post.created_at # => 2019-04-22 06:56:31 UTC 

Time.current # => Mon, 22 Apr 2019 08:56:53 CEST +02:00 
Time.now # => 2019-04-22 12:26:46 +0530 

根据skip_time_zone_conversion_for_attributes方法,跳过这些属性,当我重试属性时 - created_at它以'UTC'格式显示它而不是我的set time_zone'Berlin',按预期工作。

因此,在将其设置为JSON之前,这可能有助于您理解和检查您的设置。

有关更多信息,请参阅此链接 - https://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html

https://makandracards.com/makandra/46009-working-with-or-without-time-zones-in-rails-applications

© www.soinside.com 2019 - 2024. All rights reserved.