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')
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' –
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. –
¡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 :) –