ActiveRecord Group by语句不转换为Time.zone

时间:2012-07-31 18:51:06

标签: ruby-on-rails activerecord time timezone

我使用下面的查询来计算按日分解的支票数。

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)")

示例输出:

example output

我面临的问题是此查询是UTC格式,并且不会转换为我在config.time_zone下的application.rb文件中设置的Time.zone(PST)。在上面的示例中,最后两个签到名应位于“2012-07-30”。

我知道,对于其他查询,此转换工作正常。例如:

Checkin.last.created_at # Returns in PST

因此,必须考虑上述查询的复杂性。我猜它可能是select语句。如何编写以上内容以说明配置的时区?

2 个答案:

答案 0 :(得分:4)

我正在做同样的事情(虽然我按分钟分组)...使用下面的代码对我来说很合适......

Time.zone.utc_to_local(DateTime.parse(@checkin[:calendar_day]))

我为组中的每个项执行此操作,然后将数组哈希传递给视图层。

答案 1 :(得分:0)

我遇到了同样的问题,试图按天分组活动(这是一个高图图表)。我本来希望做这样的事情:

# Didn't work
counts = Event.where(:created_at => start_date..end_date.end_of_day)
.group("DATE(created_at)").count

return (start_date..end_date).map{ |d| counts[d] }

但是start_date和end_date在我的本地时区,而DATE函数是UTC。相反,我在Ruby中做到了这一点。

counts = Event.where(:created_at => start_date..end_date.end_of_day)
.pluck(:id, :created_at)
.group_by{|obj| obj[1].to_date}

return (start_date..end_date).map{ |d| counts[d].try(:size) }