2010-11-15 11 views
6

Recibimos una solicitud de informe y trato de encontrar la manera más fácil y eficiente de extraer los números.La forma más eficiente de recuperar los registros "top x" usando Rails

que tienen un modelo de reparto con dos atributos: _quantity_purchased_ y precio. Me han pedido que recupere una lista de las mejores 100 ofertas más vendidas en la base de datos. Para ver qué tan bien ha hecho un trato, multiplicamos la cantidad_comprada por el precio.

Ahora, estoy seguro de que podría escribir algo complicado para obtener mis resultados, pero parece una operación tan simple, que tiene que haber una manera más fácil de hacerlo. ¿Hay algo que pueda hacer en MySQL o usar Ruby/Rails? ¿O estoy atrapado buscando algún tipo de ciclo desagradable?

FYI, estamos utilizando Rails 2.3.

Respuesta

9

Puede pasar un parámetro :limit a su método find para limitar el número de resultados devueltos. En combinación con un parámetro :order, se puede obtener el 'top' 100 resultados:

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

Nota partir de Rails 3, la forma correcta de escribir esta consulta sería

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

El problema es que tengo que realizar algunas operaciones matemáticas para obtener los resultados "principales". Para calcular la cantidad de ingresos que ha alcanzado una oferta, tengo que multiplicar la cantidad_comprada por el precio. Un acuerdo que solo vendió 5, puede haber ganado más dinero que uno que vendió 50. –

+0

¡Gah! Acabo de ver tu código agregado. Voy a intentarlo. –

+1

@Kevin puede realizar las operaciones matemáticas en la cláusula ': order'. – meagar

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

que debería hazlo. En MySQL puede usar "ORDER BY 1" para ordenar por la primera columna en la lista de selección y así sucesivamente.

Cuestiones relacionadas