Rails 3 - Как получить номер строки из модели с заказом по - PullRequest
6 голосов
/ 14 сентября 2010

Я собираю небольшое приложение, в котором есть концепция списка лидеров. По сути, модель это просто player_name и current_score.

что я хочу сделать, это получить рейтинг конкретного игрока, и, учитывая, что новые результаты появляются постоянно, он должен быть динамичным. Очевидно, что я мог бы просто сделать нормальный поиск с предложением order by, и тогда мне пришлось бы перебирать каждую запись. Не очень эффективно, когда у меня может быть 100 000 строк.

Любые предложения о том, какой подход я должен использовать?

Вот миграция для таблицы:

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 Как пример, поэтому у меня есть следующее:

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

Как мне составить рейтинг «Дональд Льюис»?

Ответы [ 2 ]

13 голосов
/ 15 сентября 2010

Вы можете посчитать количество записей с более высоким значением current_score. Вам все равно придется делать это для каждой записи (или выполнять подзапрос в вашем sql).

class Score < ActiveRecord::Base

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

end
0 голосов
/ 14 сентября 2010
Score.find(:select => "player_name,max(current_score) as high_score",:group_by => "player_name",:order => "max(current_score) DESC")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...