2012-01-28 56 views
0

已檢查this視頻,這是非常有幫助的。但實際上我不想僅僅分組幾個月。我也想給他們分組條件。所以我有;使用group_by與RoR中的where語句

MyModel.where("state = 'A'").all.group_by { |q| q.created_at.beginning_of_month }.count 

但它給了我所有記錄在'A'不是當前月具體。我錯過了什麼嗎?

謝謝。

+0

您可以獲取所有'state ='A''的記錄,然後對它們進行分組。它產生一個散列,其中的鍵是月份和值的開始 - 在相應的月份中創建的記錄數組。對'count'應用''''時,只有在創建'state ='A''的記錄時,您只需要幾個月。你能描述一下你想得到的結果嗎? – 2012-01-28 10:44:22

+0

啊沒有提到計數是我的壞。我只是想獲取當前月份中創建的記錄計數,其中記錄了'A'。 – 2012-01-28 10:47:48

+0

如果你只想計算在當前月份創建的'state ='A''的記錄,爲什麼你需要分組?你想獲得每個月創建的記錄數量嗎? – 2012-01-28 10:50:06

回答

0

你可以記錄在這個月份中產生這樣說state = 'A'

MyModel.where(['state = ? AND ? <= created_at AND created_at <= ?', 
       'A', Date.today.beginning_of_month, Date.today.end_of_month]) 

應用count到查詢,你會得到這樣的記錄數。

如果您需要每月記錄數,你可以那樣做(不是最有效的方式,雖然):

records = MyModel.where("state = 'A'").all 
result = records.each_with_object(Hash.new { |h, k| h[k] = 0 }) do |record, hash| 
    hash[record.created_at.beginning_of_month] += 1 
end 

您可能需要看看如何Hash#new使用塊什麼Enumerable#each_with_object呢。

更有效的方法來計算每月記錄將是使用普通的SQL按月分組行,並將計數應用於此。在這種情況下,如果你有一張相當大的桌子,你不會從數據庫中獲取記錄本身,這會更快。

+0

謝謝你,現在解決我的問題。但如果我想獲得關於記錄的所有統計數據,我將如何做?我認爲這將是我近期的下一個問題:)。 – 2012-01-28 11:04:39

+0

增加了每月提取統計信息的解決方案。 – 2012-01-28 11:09:20