2010-09-14 10 views
6

Estoy armando una pequeña aplicación que tiene un concepto de tabla de clasificación. Básicamente, el modelo es solo un player_name y un current_score.Rails 3 - Cómo obtener el número de fila de un modelo con un pedido por

lo que quiero hacer es obtener el ranking de un jugador específico, y dado que las nuevas puntuaciones están llegando todo el tiempo, tiene que ser dinámico. Obviamente, podría hacer un hallazgo normal con una cláusula order by y luego tendría que recorrer cada registro. No es muy eficiente cuando podría tener 100,000 de filas.

¿Alguna sugerencia sobre qué enfoque debería tomar?

Aquí es la migración de la tabla:

class CreateScores < ActiveRecord::Migration 
    def self.up 
    create_table :scores do |t| 
     t.string :player_name 
     t.integer :current_score 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :scores 
    end 
end 

EDITAR A modo de ejemplo, por lo que tengo lo siguiente:

Score.select('player_name, current_score').limit(20) 
=> [#<Score player_name: "Keith Hughes", current_score: 9>, #<Score player_name: "Diane Chapman", current_score: 8>, #<Score player_name: "Helen Dixon", current_score: 4>, #<Score player_name: "Donald Lynch", current_score: 9>, #<Score player_name: "Shawn Snyder", current_score: 2>, #<Score player_name: "Nancy Palmer", current_score: 9>, #<Score player_name: "Janet Arnold", current_score: 1>, #<Score player_name: "Sharon Torres", current_score: 9>, #<Score player_name: "Keith Ortiz", current_score: 5>, #<Score player_name: "Judith Day", current_score: 3>, #<Score player_name: "Gregory Watson", current_score: 7>, #<Score player_name: "Jeremy Welch", current_score: 3>, #<Score player_name: "Sharon Oliver", current_score: 7>, #<Score player_name: "Donald Lewis", current_score: 7>, #<Score player_name: "Timothy Frazier", current_score: 7>, #<Score player_name: "John Richards", current_score: 1>, #<Score player_name: "Carolyn White", current_score: 4>, #<Score player_name: "Ronald Smith", current_score: 2>, #<Score player_name: "Emily Freeman", current_score: 9>, #<Score player_name: "Gregory Wright", current_score: 2>] 

¿Cómo puedo calcular el ranking de "Donald Lewis" ?

+0

Buena pregunta, pero parece más una pregunta sobre estructuras de datos y algoritmos que una pregunta de ruby. –

+0

Acabo de añadir algunas aclaraciones. Estoy tratando de encontrar la sintaxis de búsqueda correcta para usar. – Leddo

Respuesta

12

Puede contar el número de registros que tienen una más alta en la calificación actual. Aún tendrá que hacerlo por registro (o hacer una subconsulta en su sql).

class Score < ActiveRecord::Base 

    def ranking 
    Score.count(:conditions => ['current_score > ?', self.current_score]) 
    end 

end 
+0

¡Eso es perfecto! Acabo de hacer un cambio a +1 al ranking, como si hubiera un puntaje 0 mayor que mi clasificación sería 1 en lugar de 0. You Rock! – Leddo

0
Score.find(:select => "player_name,max(current_score) as high_score",:group_by => "player_name",:order => "max(current_score) DESC") 
+0

Estoy tratando de calcular el ranking de un jugador en particular. Su consulta solo los clasificará si estoy en lo correcto. Agregué algunas aclaraciones adicionales a la pregunta. – Leddo

Cuestiones relacionadas