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(notes)に渡されるものです。

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

1 に答える 1

1

私が言えることから、あなたはこのTumblrアカウント/ブログが持っていた1日あたりのブログの数を計算しようとしていますか?もしそうなら、

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

結果リストを再度繰り返すことなく、正しい結果が得られるはずです。注意すべき点の1つは、現在の電話では、ブログが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}'")。文字列で補間されたパラメータを避けて、SQLインジェクションに対して脆弱なコードを作成する可能性を低くするNote.where(:tumblr_id => @tumblr.id)か、次のようなコードを使用することをお勧めします。Note.where("tumblr_id = ?", @tumblr.id)

于 2012-05-13T02:35:04.477 に答える