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(notes) 的内容。

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

1 回答 1

1

据我所知,您正在尝试计算此 Tumblr 帐户/博客每天有多少转发?如果是这样,

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)减少编写易受 SQL 注入攻击的代码的机会

于 2012-05-13T02:35:04.477 回答