2012-05-10 9 views
5

Tengo una base de datos con 6500 players y cada jugador tiene un promedio de 15 juego results.Orden Jugadores en la SUMA de su asociación modelo

Caso de uso

Quiero generar una lista de jugadores, ordenado por la suma de su dinero premio (un campo en la tabla de resultados). prefiero que esto sea en algún tipo de alcance, por lo que también se puede filtrar la lista de país del jugador, etc.

Rendimiento

he visto mensajes que mencionan un campo cache_counter para el rendimiento. En mi caso tengo miles de registros de resultados (75,000+) por lo que no quiero que los cálculos se realicen cada vez que alguien visita los listados generados.

Pregunta

¿Cuál es el mejor patrón para resolver esto? ¿Y cómo lo implemento?

Modelos

class Player < ActiveRecord::Base 
    has_many :results 
end 

class Result < ActiveRecord::Base 
    belongs_to :player 
end 

esquemas

create_table "players", :force => true do |t| 
    t.string "name" 
    t.string "nationality" 
    end 

    create_table "results", :force => true do |t| 
    t.integer "player_id" 
    t.date  "event_date" 
    t.integer "place" 
    t.integer "prize" 
    end 

actualización

Lo que estoy tratando de lograr es llegar a un punto en el que puedo utilizar:

@players = Player.order_by_prize 

y

@players = Player.filter_by_country('USA').order_by_prize('desc') 

Respuesta

10

Usted debe ser capaz de usar algo como esto:

class Player 
scope :order_by_prize, joins(:results).select('name, sum(results.prize) as total_prize').order('total_prize desc') 

Consulte rieles api - active record querying para más detalles.

+4

Tuve que hacer algunos ajustes a tu sugerencia, y ahora ordena con precisión por la suma de sus premios: 'scope: order_by_prize, joins (: results) .select ('players.id, players.name, sum (results) .prize) como total_prize '). group (' players.id ') order (' total_prize desc ') '. Sin embargo, los resultados solo muestran 'player.id' y' player.name', no el resultado 'total_prize' –

+0

Por cierto, hice esos ajustes porque estoy usando PostgreSQL y en la consola me dijo que incluyera una cláusula group by después de ejecutar su código. –

+0

¡No importa! En la consola, 'total_prize' no aparece en la pantalla en la salida resultante, pero el atributo está configurado y disponible correctamente. Muchas gracias :) –

Cuestiones relacionadas