按created_at对用户进行分组,并为MorrisJs插入哈希值

时间:2015-07-23 15:15:07

标签: ruby-on-rails group-by

我想使用MorrisJs-Rails构建过去4周内注册用户的图形统计信息。

为此,我会迭代上个月的每一天并检查在此特定日期注册的用户。这是问题所在。

admin_helper.rb

def users_chart_date
  (4.weeks.ago.to_date..Date.today).map do |date|
      {
        created_at: date,
        count: User.where("created_at = ? ", date).count
      }
  end
end

这两个日期的存储方式如下:

puts User.first.created_at # => Tue, 10 Mar 2015 20:08:18 UTC +00:00
puts date # => Thu, 23 Jul 2015

您可以看到这两个存储日期之间存在很大差异,因此我无法获得每天注册的实际用户数。

有没有办法去"演员"我的SQL查询不知何故?我觉得我的问题的解决方案很容易,但我似乎无法得到它。

感谢您的帮助, 如果你需要什么,请告诉我。

1 个答案:

答案 0 :(得分:3)

正如您所注意到的,created_at时间戳的类型为DateTime(或Time),因此您的正确性与Date无法直接比较}类型。您可以将其与每天的一系列时间进行比较:

(4.weeks.ago.to_date..Date.today).map do |date|
  {
    created_at: date,
    count: User.where(created_at: date.to_time.all_day).count
  }
end

(请注意,这将使用计算机时区的时间。)

但是,此方法可能变得非常慢,特别是如果时间范围变长(例如,在应用程序的整个生命周期内),在这种情况下,SQL GROUP BY语句的工作速度要快得多。同样,您需要按时间数据字段处理日期比较,该数据字段取决于数据库。使用MySQL或PostgreSQL,您可以:

User.group("DATE(created_at)").count

如果您想限制获取数据的时间段:

User.where("created_at >= ?", 4.weeks.ago.beginning_of_day).group("DATE(created_at)").count

这些查询会在当天Date次将created_at个对象的哈希值返回给用户数。