2011-08-19 12 views
6

Entonces, tengo un modelo Photo que se puede descargar en full_size y presentation_size. Cuando un usuario descarga una foto, hago un seguimiento de esto en el atributo full_downloads y presentation_downloads de la foto.Rieles: orden por suma de dos columnas

Eso es todo bien.

A veces quiero saber cuántas descargas totales ha habido. Tengo un método simple, total_downloads que se ve así:

def total_downloads 
    self.full_downloads + self.presentation_downloads 
end 

Mi pregunta es: Me gustaría ser capaz de ordenar las fotos por los tres de estos (completa, presentación, descargas totales). Los dos primeros son fáciles, pero ¿cómo se hace un pedido por la suma de dos columnas? Tenga en cuenta que esto debe ser compatible tanto con SQLite como con PG al mínimo.

Una pregunta complementaria, ¿sería más rápido hacer una consulta al método total_downloads y, de ser así, cuál es la mejor manera de escribir eso? Sé que para resumir en la clase puede llamar al Photo.sum(...), pero no estoy seguro de cómo hacer eso para dos columnas en un solo registro.

Gracias!

+0

¿Estaría bien con escribir el SQL directamente o sería un problema? –

+0

@Devin M - Haré lo que tengo que hacer :) – Andrew

Respuesta

16

Puede probar esto:

Photo.order('full_downloads + presentation_downloads') 

Se ejecuta esta consulta SQL:

SELECT "photos".* FROM "photos" ORDER BY full_downloads + presentation_downloads 

Esto es potencialmente lento. Si tiene un conjunto de datos grande y usa este orden de clasificación a menudo, debe considerar crear una columna total_downloads y volver a calcular su valor si cambia la columna full_downloads o presentation_downloads del registro.

+4

+1 Potencialmente lento, pero aún más rápido que en Ruby. –

+0

@Kirk: Sí, así es :) – htanata

+0

Se ve bien. ¡Gracias! – Andrew

3

Photo.order('full_downloads + presentation_downloads DESC')

Eso sería sin duda mucho más rápido que haciendo la clase en Ruby.