2010-11-15 7 views
6

Nous avons reçu une requête de rapport, et j'essaie de trouver le moyen le plus simple et le plus efficace d'extraire les nombres.Le moyen le plus efficace de récupérer des enregistrements "top x" en utilisant Rails

J'ai un modèle de convention avec deux attributs: _quantity_purchased_ et prix. On m'a demandé de récupérer une liste des 100 meilleures offres de vente dans la base de données. Pour voir à quel point une affaire a bien marché, nous multiplions la quantité achetée par le prix.

Maintenant, je suis sûr que je pourrais écrire quelque chose de compliqué pour obtenir mes résultats, mais cela semble une opération si simple, qu'il doit y avoir une façon plus simple de le faire. Y a-t-il quelque chose que je pourrais faire en MySQL, ou en utilisant Ruby/Rails? Ou suis-je coincé à trouver une sorte de boucle désagréable?

Pour info, nous utilisons Rails 2.3.

Répondre

9

Vous pouvez passer un paramètre :limit à votre méthode find pour limiter le nombre de résultats renvoyés. Combiné avec un paramètre :order, vous pouvez obtenir le 'top' 100 résultats:

Deal.find(:all, :order => 'quantity_purchased * price', :limit => 100); 

billet à Rails 3, la manière correcte d'écrire cette requête serait

Deal.order('quantity_purchased * price').limit(100) 
+0

Le problème est que je dois effectuer quelques calculs pour obtenir les résultats «supérieurs». Pour calculer le revenu d'une affaire, je dois multiplier la quantité par le prix. Une affaire qui a seulement vendu 5, peut avoir fait plus d'argent que celle qui a vendu 50. –

+0

Gah! Juste vu votre ajout de code. Je vais essayer. –

+1

@Kevin vous pouvez effectuer le calcul dans la clause ': order'. – meagar

1
class Deal < ActiveRecord::Base 
    named_scope :top_deals, :select => 'quantity_purchased * price', :order => '1 DESC', :limit => 100 
end 

Cela devrait fais le. En MySQL vous pouvez utiliser "ORDER BY 1" pour trier par la première colonne dans la liste de sélection et ainsi de suite.

Questions connexes