У меня есть система голосования с двумя моделями: 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
В этом есть несколько проблем, в основном из-за того, что я извлекаю все записи Предметов, ТОГДА использую Ruby для вычисления популярности. Я почти уверен, что есть простое решение для этого, но я не могу понять, что именно.
Я бы предпочел собрать записи и выполнить вычисления в начальном запросе. Таким образом, я могу добавить простой :limit => 1
(или LIMIT 1
) к запросу.
Будет полезна любая помощь - либо переписать во всех ActiveRecord, либо даже в сыром SQl. Последнее фактически дало бы мне более ясную картину характера запроса, который я хочу выполнить.