2013-03-27 77 views
1

我想建立一個數組,通過模型的方法是這樣的:的Rails 3計數記錄的日期

[['3/25/13', 2], ['3/26/13', 1], ['3/27/13', 2]]

其中,日期是字符串,在他們之後的數字是一個企業的count表/對象。

我有以下的模型方法現在:

def self.weekly_count_array 
    counts = count(group: "date(#{table_name}.created_at)", conditions: { created_at: 1.month.ago.to_date..Date.today }, order: "date(#{table_name}.created_at) DESC") 
    (1.week.ago.to_date).upto(Date.today) do |x| 
    counts[x.to_s] ||= 0 
    end 
    counts.sort 
end 

但是,它不能準確地返回計數(所有值都爲零)。在我看來,似乎有一些類似的問題,但似乎無法讓他們工作。

有人可以幫(1)讓我知道這是做的最好的方法,和(2)提供的問題可能與上面的代碼是什麼方面的一些指導,如果是這樣?謝謝!

+0

你得到什麼的'counts'變量在方法?該查詢是否按照您期望的那樣返回值? – 2013-03-27 18:01:04

+0

我正在嘗試總計特定日期的記錄數。不,「計數」似乎是突破的部分。 – Justin 2013-03-27 18:10:45

+0

對不起,誤解了這個問題。上面的方法根據格式返回適當的數組,但對於所有對象計數都具有0,即使對象存在幾天。 – Justin 2013-03-27 18:29:48

回答

7

以此爲模板,如果你想

def self.period_count_array(from = (Date.today-1.month).beginning_of_day,to = Date.today.end_of_day) 
    where(created_at: from..to).group('date(created_at)').count 
end 

這將返回的日期爲鍵和算作值的哈希。 (Rails的3.2.x中)由@Aditya Sanghi的

+0

這是我的代碼上面的問題 - 我推出'Date.today'而不指定'end_of_day'。因此,該對象今天沒有顯示。所以,我的問題中的代碼起作用,這只是一個添加的問題,但這確實是一個更加優雅的散列解決方案。謝謝! – Justin 2013-03-27 18:48:02

0

你並不需要一個過程來進行計數。只需爲此執行查詢。

def self.weekly_count_array 
    select("created_at, COUNT(created_at) AS count") 
    where(created_at: 1.month.ago.to_date..Date.today) 
    group("created_at") 
    order("created_at DESC") 
end 
+0

雖然我想將計數放入一個數組,但日期是另一個組件。沒有這個過程,就沒有零。 – Justin 2013-03-27 18:12:01

+0

好您可以創建的所有日期和計數器零的數組,只是做查詢返回的日期和計數器合併。 – 2013-03-27 18:15:10

+0

你將不得不向我展示你的意思。上面發佈的方法只是將對象放入數組中而不列出所有日期。我希望有一個數組,像方法返回的原始問題中的數組,每天的日期和計數,以及沒有計數的天數爲零。 – Justin 2013-03-27 18:27:43

1

也許這就是你想要做的?

class YourActiveRecordModel < ActiveRecord::Base 

    def.self weekly_count_array 
    records = self.select("COUNT(id) AS record_count, DATE(created_at) AS created") 
     .group("DATE(created_at)") 
     .where("created_at >= ?", 1.month.ago.to_date) 
     .where("created_at <= ?", Date.current) 

    records.each do |x| 
     puts x.record_count 
     puts x.created # 2013-03-14 

     # use I18n.localize(x.created, format: :your_format) 
     # where :your_format is defined in config/locales/en.yml (or other .yml) 
    end   
    end 
end 
1

意想不到的答案。

如果你有確切的要求,你可以選擇:

def self.weekly_count_array 
    records = select('DATE(created_at) created_at, count(id) as id').group('created_at') 
    1.week.ago.to_date.upto(Date.today).map do |d| 
    [d, records.where('DATE(created_at) = ?', d.to_date).first.try(:id) || 0] 
    end 
end 
0

建立在@kiddorails答案,

,這樣不會讓大量的請求到數據庫,從ActiveRecord的創建一個哈希

&改變了組從。集團( 'created_at')到。集團( 'DATE(created_at)'),以將它基於日期

def self.weekly_count_array 
    # records = select('DATE(created_at) created_at, count(id) as id').group('created_at') 
    records_hash = Hash[Download.select('DATE(created_at) created_at, count(id) as id').group('DATE(created_at)').map{|d|[d.created_at, d.id] }] 
    1.month.ago.to_date.upto(Date.today).map do |d| 
    [ d, records_hash[d.to_date] || 0 ] 
    end 
end