ruby-on-rails - 按created_at对用户进行分组并插入到MorrisJs的哈希中

标签 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 查询?我觉得解决我的问题很容易,但我似乎无法得到它。

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

最佳答案

正如您所注意到的,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

这些查询将向当天具有 created_at 次的用户计数返回 Date 对象的哈希值。

关于ruby-on-rails - 按created_at对用户进行分组并插入到MorrisJs的哈希中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31591493/

相关文章:

ruby-on-rails - AWS 和 Rails : The authorization header is malformed; the Credential is mal-formed

ruby-on-rails - 访问 rescue_from 中的参数

mysql - 按工作日分组

ruby-on-rails - 自动重新加载 config/locales 中的 rails yml 文件

javascript - 如何刷新父页面#Rails

mysql - 按浏览器对用户代理进行分组

r - 使用分组计算过去和 future 特定事件的发生次数

mysql - 使用 group by 时返回按 ID 排序的最新行

java - 在 "Enterprise"中使用 Django 的任何人

python - 如何在Python中找到每周表现最好的10个值?