我想使用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查询不知何故?我觉得我的问题的解决方案很容易,但我似乎无法得到它。
感谢您的帮助, 如果你需要什么,请告诉我。
答案 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
个对象的哈希值返回给用户数。