2012-05-12 8 views
1

私は、メモの数を追加するより効率的な方法を試しています。単純なwhere条件をクエリに適用しました。しかし、これには、繰り返し実行する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

私はすでに正しい方法で行っていると思います。あなたは1つのクエリを作成し、それは良いです!おそらく、created_atまたはnote_typeカラムにインデックスを追加することで速度を上げることができます。このジョブを何度も実行する必要がある場合は、カウントキャッシングをチェックする必要があります。 –

答えて

1

このTumblrのアカウントやブログのreblogs/dayの件数を計算しようとしていますか?その場合は、

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

関連する問題