2012-06-09 34 views
0

在Rails應用程序中,我有一個User模型和Posts模型。如何創建記錄計數數組,按月分組並保持性能?

我有一個:post_rate方法

def self.post_rate(month_start, month_end) 
    where('created_at >= ? AND <= ?', month_start, month_end).map { |p| p.created_at.beginning_of_day }.uniq.size.to_f/(month_start - month_end).to_f 
end 

這說明天張貼在給定的時間內用戶的百分比。

在用戶展示頁面上我想按月顯示用戶發佈頻率的摘要。我需要一個看起來像這樣的數組:

['Month', 'Frequency'], 
['Jan', 0.1], 
['Feb', 0.5], 
['Mar', 0.9], 
etc.. 

(需要標籤和標題)。

我該如何做到這一點?

我需要考慮哪些性能考慮事項?

感謝

回答

1

如果你的軌道是夠近,你可以使用ActiveRecord的查詢智慧編譯查詢,這是否在SQL。您可以通過group將函數傳遞給GROUP BY子句:

where('created_at >= ? AND <= ?', month_start, month_end).group("to_char(created_at,'MONTH')").count() 

上述工作適用於PostgreSQL。您可能必須將參數更改爲group才能使其與其他數據庫一起使用。

結果將採用散列形式,其鍵是GROUP BY列,其值是計數。您可能需要進行一些調整以獲取所需格式的數據。

+0

謝謝邁克爾,那是一個很好的開始。幾個問題。我如何確保所有月份都包含在數組中,即使他們沒有記錄。我怎麼能把結果大小除以天數?例如,如果查詢1年,March應該除以31,如果查詢兩年,則應該除以62等。感謝您的幫助! –

+0

這些是你必須要做的第一行結果。您也可以考慮更改'to_char'函數的參數來傳遞數字月份。這將使得生成的哈希更容易操作;然後您可以創建一個新的散列,以字「月」作爲關鍵字。 –

+0

太好了,謝謝!我會試驗 –