J'ai un système de vote avec deux modèles: Item (id, name) et Vote (id, item_id, user_id).Aide à l'optimisation de la requête ActiveRecord (système de vote)
Voici le code que j'ai jusqu'à présent:
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
Il y a quelques choses de mal à cela, surtout que je récupère tous les enregistrements d'article, utilisez Ruby pour calculer la popularité. Je suis presque certain qu'il existe une solution simple à cela, mais je ne peux pas vraiment mettre le doigt dessus.
Je préférerais de loin rassembler des enregistrements et exécuter les calculs dans la requête initiale. De cette façon, je peux ajouter un simple :limit => 1
(ou LIMIT 1
) à la requête.
Toute aide serait géniale - soit réécrire dans tout ActiveRecord ou même dans SQl brut. Ce dernier me donnerait une image beaucoup plus claire de la nature de la requête que je veux exécuter.
Magnifique! Voici la syntaxe Rails 2.x que j'ai dérivé de ceci: Vote.find (: all,: groupe => "item_id",: order => "count (*) DESC",: limite => 1) .first.item – user94154
N'oubliez pas: include =>: item (voir ma réponse) ou vous ferez une requête supplémentaire lorsque vous appelez l'item Vote #. En combinant aussi: limite => 1 et Array # semble d'abord redondant quand vous pouvez simplement appeler Vote # en premier. –