我有一个带有两个模型的投票系统:Item(id, name) 和 Vote(id, item_id, user_id)。
这是我到目前为止的代码:
class Item < ActiveRecord::Base
has_many :votes
def self.most_popular
items = Item.all #where can I optimize here?
items.sort {|x,y| x.votes.length <=> y.votes.length}.first #so I don't need to do anything here?
end
end
这有一些问题,主要是我检索所有的 Item 记录,然后使用 Ruby 来计算流行度。我几乎肯定有一个简单的解决方案,但我不能完全确定它。
我更愿意收集记录并在初始查询中运行计算。这样,我可以向查询添加一个简单的 :limit => 1
(或 LIMIT 1
)。
任何帮助都会很棒——要么在所有 ActiveRecord 中重写,要么甚至在原始 SQl 中重写。后者实际上可以让我更清楚地了解我想要执行的查询的性质。
最佳答案
按项目 ID 对投票进行分组,按计数排序,然后取第一个项目。在 Rails 3 中,代码是:
Vote.group(:item_id).order("count(*) DESC").first.item
在 Rails 2 中,这应该可以工作:
Vote.all(:order => "count(*) DESC", :group => :item_id).first.item
关于sql - 帮助优化ActiveRecord查询(投票系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3808021/