我有一个投票系统有两个模型:Item(id,name)和Vote(id,item_id,user_id)。帮助优化ActiveRecord查询(投票系统)
这里是我到目前为止的代码:
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
有几件事情不对的,主要是我检索所有项目的记录,然后使用Ruby来计算的普及。我几乎可以肯定,这有一个简单的解决方案,但我不能完全明白这一点。
我宁愿收集记录并在初始查询中运行计算。这样,我可以在查询中添加一个简单的:limit => 1
(或LIMIT 1
)。
任何帮助将是伟大的 - 重写所有ActiveRecord甚至原始SQl。后者实际上会让我更清楚地了解要执行的查询的性质。
美丽!这里是我从这个派生的Rails 2.x语法:Vote.find(:all,:group =>“item_id”,:order =>“count(*)DESC”,:limit => 1).first.item – user94154 2010-09-27 21:45:32
不要忘记:include =>:item(请参阅我的答案),否则当您打电话给Vote#项目时,您会做额外的查询。如果您可以先调用Vote#,那么还要组合:limit => 1和Array#首先看起来多余。 – 2010-09-28 04:56:49