情况:
我正在开发一个以UTC为应用程序时区的Rails应用程序,因此来自任何区域的任何用户的数据都将以UTC格式保存在数据库中。
让我们假设一位来自中央时间(美国和加拿大((与UTC相差5小时(的用户于2014年7月28日下午6:45在我的网站上注册。因此,数据库中用户的created_at将为2014年7月28日星期一23:45:00 UTC+00:00。现在,同一用户在当天晚上7:30上传照片模型中的照片。因此,用户的照片记录中created_at的值将为2014年7月29日星期二00:30:30 UTC+00:00。
因此,在UTC中存储值会导致用户created_at和为用户存储的照片之间相差1天,尽管用户实际上在注册网站的同一天上传了照片。
要求:
我想找到用户在创建当天上传的所有照片。所以我实现了查询-
预期结果=>1
u = User.first
u.created_at
=> Mon, 28 Jul 2014 23:45:00 UTC +00:00
u.photos.where('Date(created_at) = ?', u.created_at).count
=> 0 {Failed - Because the db compares the time in UTC}
经过大量的搜索和研究,我才知道如何将Timezone设置为用户时区。
u = User.first
Time.zone = u.time_zone
=> Central Time (US & Canada)
u = User.first
u.created_at
=> Mon, 28 Jul 2014 18:45:49 CDT -05:00 {Correct Time as per my requirements}
Photo.where('user_id = ? and Date(created_at) = ?', u.id, u.created_at).count
=> 0 {Failed}
但当我试图找到用户上传的照片记录的created_at时,它返回了正确的时间戳-
u.photos.first.created_at
=> Sun, 28 Jul 2014 19:30:00 CDT -05:00
因此,设置Time.zone只允许Ruby返回指定时区的时间,但Rails Active Record会继续比较UTC的时间
请有人建议是否有任何方法可以通过将时间戳从utc更改为用户time_zone来使用活动记录查询。
我知道这是一篇旧帖子,但在其他人阅读这篇帖子时,我发现了使用local_time
gem的帮助,它将保存的日期渲染到用户时区中:https://github.com/basecamp/local_time
否则,如果您绝对必须更改DB中的时区,我认为本教程可能是您所需要的:https://gorails.com/episodes/auto-detect-user-time-zones-in-rails