我想使用 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/