我有一個投票系統有兩個模型: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