在同一天创建的记录数

时间:2012-02-27 15:50:19

标签: sql ruby-on-rails ruby ruby-on-rails-3 activerecord

我正在尝试创建一个类似这样的数组:

[ [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]}

但我还没想弄出那些在同一天创建的记录。此循环也为每个记录创建一个数组,我不想要总和的重复。

3 个答案:

答案 0 :(得分: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或任何其他方法。

答案 1 :(得分: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'] ] }

答案 2 :(得分:1)

以下内容将产生您要求的结果:

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