【发布时间】:2012-07-29 15:00:06
【问题描述】:
我使用下面的查询来计算按天细分的签到次数。
Checkin.select("date(created_at) as calendar_day, count(*) as total_checkins").where("user_id = ? AND created_at > ?", user.id, 28.days.ago).group("date(created_at)").order("date(created_at)")
示例输出:
我面临的问题是这个查询是 UTC 格式的,不能转换为我在 config.time_zone 下的 application.rb 文件中设置的 Time.zone (PST)。在上面的示例中,最后两次签到应在“2012-07-30”下。
我知道对于其他查询,这种转换可以正常工作。例如:
Checkin.last.created_at # Returns in PST
所以这一定是上面查询的复杂性。我猜这可能是选择语句。我如何编写以上内容来说明配置的时区?
【问题讨论】:
-
问题是您在 SQL 中按日期分组。数据库不知道您想要不同的时区。不知道如何做到这一点......
-
看看这里的问题:stackoverflow.com/questions/10274375/… 这个问题似乎是 Rails 没有在 postgres 中创建支持时区的列。
-
感谢您的链接。看起来如果不进入 schema.rb 并手动更改“created_at”和“updated_at”字段类型,就无法按原样修复。我对这样做很谨慎。也许还有另一种方法可以让我编写查询,其中“分组”实际上发生在 Rails 中?
-
好吧,我想你可以在 Rails 中进行分组,但是如果数据集增长,它会变得疯狂并且会占用大量内存,因为你必须实例化所有 AR 对象能够按日期对它们进行分组...如果我只是显示统计信息是基于 UTC 时区显示的,或者如果您只使用一个时区(不太可能)将数据库切换到您的本地时区
-
我的猜测是 getter 将其转换为正确的时区。您是否尝试过
.first.created_at 以查看它是否为您提供了正确的时区?
标签: ruby-on-rails activerecord time timezone