2012-02-27 127 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