【问题标题】:ActiveRecord Group by statement not converting to Time.zoneActiveRecord Group by 语句未转换为 Time.zone
【发布时间】: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


【解决方案1】:

我正在做同样的事情(尽管我是按分钟分组的)...使用下面的代码适合我...

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

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

【讨论】:

    【解决方案2】:

    我在尝试按天对活动进行分组时遇到了同样的问题(这是针对高图表的图表)。我本来想做这样的事情:

    # 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) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-21
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多