Ruby on rails 按在处创建的_对用户进行分组,并插入到MorrisJs的哈希中

Ruby on rails 按在处创建的_对用户进行分组,并插入到MorrisJs的哈希中,ruby-on-rails,group-by,Ruby On Rails,Group By,我想使用MorrisJs Rails建立过去4周内注册用户的图形统计 为此,我迭代了上个月的每一天,并检查在这个特定日期注册的用户。但问题是 管理员助手.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 }

我想使用MorrisJs Rails建立过去4周内注册用户的图形统计

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

管理员助手.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查询?我觉得解决我的问题很容易,但我似乎找不到

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

正如您所注意到的,在时间戳创建的
是类型
日期时间
(或
时间
),因此您是正确的,它与日期
类型没有直接的可比性。您可以将其与每天的一系列时间进行比较:

(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
对象的散列返回到当天在
时间创建
的用户数。

非常感谢!我将使用第一种方法,尽管速度较慢,但它目前适合我的需要(我是唯一能够访问这些数据的人;p)。