针对大量列的更有效的Active Record查询

时间:2012-05-12 23:30:59

标签: sql ruby-on-rails ruby

我正在尝试找出一种更有效的方法来添加音符计数,其中有几个简单的条件适用于查询。但这可能需要永远,因为有多达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 个答案:

答案 0 :(得分:1)

据我所知,您正在尝试计算这个Tumblr帐户/博客每天有多少个reblogs?如果是的话,

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

应该为您提供正确的结果,而不必再次遍历结果列表。有一点需要注意,现在你的通话不会表明什么时候有0个reblog日。如果您将来电置于#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