2010-09-14 8 views
6

Przygotowuję małą aplikację, która zawiera w sobie koncepcję tabel wyników. Zasadniczo, model jest po prostu nazwą gracza i current_score.Szyny 3 - Jak uzyskać numer wiersza z modelu z zamówieniem pod numerem

co chcę zrobić, to ranking konkretnego gracza, a biorąc pod uwagę, że nowe wyniki idą cały czas, musi być dynamiczny. Oczywiście mogłem po prostu zrobić zwykłe znalezisko z klauzulą ​​order by, a potem musiałbym przechodzić przez każdy rekord. Niezbyt wydajna, gdybym mógł mieć 100 000 wierszy.

Jakieś sugestie dotyczące tego, jakie podejście powinienem podjąć?

Oto migracja do tabeli:

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 

EDIT Jako przykład, więc mam następujące:

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>] 

Jak mogę pracować z rankingu "Donald Lewis" ?

+0

Dobre pytanie, ale wydaje się bardziej jak pytanie o struktury danych i algorytmy, niż pytanie rubinowe. –

+0

Właśnie dodałem trochę wyjaśnienia. Próbuję znaleźć prawidłową składnię find, której należy użyć. – Leddo

Odpowiedz

12

Można policzyć liczbę rekordów, które mają wyższy current_score. Będziesz musiał to zrobić w każdym rekordzie (lub wykonać pod-zapytanie w sql).

class Score < ActiveRecord::Base 

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

end 
+0

To jest idealne! Właśnie zmieniłem pozycję +1 w rankingu, tak jakby było 0 punktów więcej niż mój ranking wynosiłby 1 zamiast 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

Próbuję ustalić ranking konkretnego gracza. Twoje zapytanie po prostu je posortuje, jeśli mam rację. Dodałem kilka dodatkowych wyjaśnień do pytania. – Leddo