2012-02-27 121 views
3
当天

我想创建一个数组,它应该是这样的:伯爵所创建

[ [created_at date * 1000, count record for that date], 
    [created_at date * 1000, count record for that date], 
    [created_at date * 1000, count record for that date] ] 

的created_at日期是不完全一样的,因为分,小时和秒。 我当时的想法是有可能上创建created_at时间更改为00:00:00

我已经试过这一点,

@kliks = Klik.all.map{|klik| [(klik.created_at.to_i * 1000), 1]} 

但我还没有搞清楚,总结所创建的同一天的记录。此外,这个循环为每一条记录创建一个数组,我不想重复总和。

回答

5

Rails有ActiveRecord::Calculations其目的是做的正是这种数据库级别的东西。你应该使用它。在这种情况下,count是你想要的方式:

@kliks = Klik.count(:group => "DATE(created_at)") 

这等同于以下SQL:

SELECT *, COUNT(*) FROM kliks 
GROUP BY DATE(created_at) 

DATE()功能是MySQL的改变日期时间(如created_at,如2012-02-27 10:08:59)到明白的日期(例如2012-02-27)。无需将事物转换为整数或乘以分钟和秒,并且不需要在Ruby中使用map或任何其他方法。

+0

我在我的数据库中有kliks,数组在你的代码之后:[[1330285888000,1],[1330296432000,1],[1330354931000,1]]。其中两个克利克是在同一天创建的。所以应该只有2个数组。此外,DATE功能似乎不能正确工作。 – 2012-02-27 16:21:04

+0

我有MySQL 5.5.16 – 2012-02-27 16:38:33

+0

@Jordan我认为乘法是必要的,因为OP很可能试图将日期表示为自1970年以来的毫秒数,以便为JS创建一个Date对象用于现有的绘图库(如海军报)。 [但是,这与按日期分组和计算的原始问题是分开的。] – Phrogz 2012-02-27 16:40:36

3

按照query guide,你应该

items = Klik.select("date(created_at) as creation_date, count(*) as count").group("date(creation_date)") 
result = items.map { |k| [ k['creation_date'], k['count'] ] } 
+0

+1对于解决方案确实使用计数方法与我发现更清洁的组。 – 2012-02-27 17:13:04

1

尝试以下方法会产生的结果,你都问了:

Klik.all.group_by do |k| 
    k.created_at.beginning_of_day 
end.map do |date, records| 
    [date, records.length] 
end 
+0

请注意,这可能效率较低,将完整的数据从SQL服务器传输到Ruby,然后进行分组和计数,而不是在RDBMS本身上执行这些操作。 – Phrogz 2012-02-27 16:01:28

+0

我同意!我会和乔丹一起回答。 – 2012-02-27 16:10:36