2012-05-12 51 views
1

我試圖找出一個更有效的方法來添加一個筆記計數,與幾個簡單的條件應用於查詢。然而,這可能會持續很長時間,因爲有多達20K條記錄需要迭代。歡迎任何關於此的想法。更高效的活動記錄查詢大量的列

def reblog_array(notes) 
    data = [] 
    notes.select('note_type, count(*) as count').where(:note_type => 'reblog', :created_at => Date.today.years_ago(1)..Date.today).group('DATE(created_at)').each do |n| 
    data << n.count 
    end 
    return data 
end 

這是什麼傳遞給從我的控制器reblog_array(注)。

@tumblr = Tumblr.find(params[:id]) 
@notes = Note.where("tumblr_id = '#{@tumblr.id}'") 
+1

我想你已經在做了正確的方式的機會較少。你只做一個查詢,這很好!也許你可以通過向created_at或note_type列添加一些索引來加速。如果你需要多次做這項工作,你應該檢查計數緩存。 –

回答

1

從我可以告訴,你想計算這個的tumblr帳戶/博客多少reblogs /天的?如果是這樣,

notes.where(:note_type => 'reblog', :created_at => Date.today.years_ago(1)..Date.today).group('DATE(created_at)').count.values 

應該給你正確的結果,而不必再次遍歷結果列表。有一件事要注意,你現在打來的電話不會表明什麼時候有0天的重複日誌。如果您撥打電話#values,您將得到一個date => count的散列。

順便說一句,倘若你不知道,我也建議更多地利用ActiveRecord的關係:

Class Tumblr 
    has_many :notes 
end 

@tumblr = Tumblr.find(params[:id]) 
@notes = @tumblr.notes 

這樣你可以避免像Note.where("tumblr_id = '#{@tumblr.id}'")編寫代碼。這是最好的避免字符串內插參數,有利於代碼像Note.where(:tumblr_id => @tumblr.id)Note.where("tumblr_id = ?", @tumblr.id)離開,你會寫代碼vulnerable to SQL injection