2010-11-15 4 views
6

Wir haben eine Berichtanforderung erhalten und ich versuche herauszufinden, wie die Zahlen am einfachsten und effizientesten abgerufen werden können.Der effizienteste Weg zum Abrufen von "Top X" -Einträgen mit Rails

Ich habe ein Deal Modell mit zwei Attributen: _quantity_purchased_ und Preis. Ich wurde gebeten, eine Liste der Top 100 der meistverkauften Deals in der Datenbank abzurufen. Um zu sehen, wie gut ein Geschäft zustande gekommen ist, multiplizieren wir die Menge mit dem Preis.

Nun, ich bin sicher, ich könnte etwas verschachtelt schreiben, um meine Ergebnisse zu bekommen, aber das scheint so eine einfache Operation zu sein, dass es einen einfacheren Weg geben muss. Kann ich etwas in MySQL machen oder Ruby/Rails verwenden? Oder bin ich dabei, eine unangenehme Schleife zu finden?

FYI, wir laufen Schienen 2.3.

Antwort

9

Sie können einen :limit Parameter an Ihre find Methode übergeben, um die Anzahl der zurückgegebenen Ergebnisse zu begrenzen. In Kombination mit einem :order Parameter können Sie die 'top' 100 Ergebnisse erhalten:

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

Hinweis ab Rails 3, der richtige Weg, um diese Abfrage zu schreiben

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

Das Problem ist, dass ich etwas Mathe durchführen muss, um die "besten" Ergebnisse zu erhalten. Um zu berechnen, wie viel Umsatz ein Geschäft gemacht hat, muss ich die Menge mit dem Preis multiplizieren. Ein Deal, der nur 5 verkaufte, hat vielleicht mehr Geld gemacht als einer, der 50 verkaufte. –

+0

Gah! Habe gerade deinen Code-Zusatz gesehen. Ich werde es versuchen. –

+1

@Kevin können Sie die Mathematik in der Klausel ': order' ausführen. – meagar

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

wäre das sollte TU es. In MySQL können Sie "ORDER BY 1" verwenden, um nach der ersten Spalte in der Auswahlliste zu sortieren.

Verwandte Themen