代码之家  ›  专栏  ›  技术社区  ›  Leddo

Rails 3-如何从具有order by的模型中获取行号

  •  6
  • Leddo  · 技术社区  · 14 年前

    我正在整理一个小应用程序,其中有一个排行榜的概念。基本上,这个模型只是一个玩家的名字和当前的分数。

    对我应该采取什么方法有什么建议吗?

    以下是表的迁移:

    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
    

    举个例子,我有以下几点:

    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 回复  |  直到 14 年前
        1
  •  13
  •   Shadwell    14 年前

    您可以计算当前分数较高的记录数。您仍然需要对每个记录执行此操作(或者在sql中执行子查询)。

    class Score < ActiveRecord::Base
    
      def ranking
        Score.count(:conditions => ['current_score > ?', self.current_score])
      end
    
    end
    
        2
  •  0
  •   Kaleb Pederson    14 年前
    Score.find(:select => "player_name,max(current_score) as high_score",:group_by => "player_name",:order => "max(current_score) DESC")