2010-09-14 34 views
6

Tôi đang kết hợp một ứng dụng nhỏ có khái niệm bảng thành tích trong đó. Về cơ bản, mô hình chỉ là một player_name và một current_score.Rails 3 - Cách lấy số hàng từ một mô hình với một đơn đặt hàng bằng

điều tôi muốn làm là xếp thứ hạng của một người chơi cụ thể và cho rằng điểm số mới sẽ đến vào mọi lúc, nó cần phải năng động. Rõ ràng tôi chỉ có thể làm một tìm kiếm bình thường với mệnh lệnh theo mệnh đề và sau đó tôi sẽ phải lặp qua từng bản ghi. Không hiệu quả lắm khi tôi có 100.000 hàng.

Bất kỳ đề xuất nào về cách tiếp cận nào tôi nên thực hiện?

Đây là việc di chuyển cho bảng:

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 Như một ví dụ, vì vậy tôi có như sau:

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

Làm thế nào tôi có thể làm việc ra các bảng xếp hạng của "Donald Lewis" ?

+0

Câu hỏi hay, nhưng dường như nó giống như câu hỏi về cấu trúc dữ liệu và thuật toán hơn là câu hỏi ruby. –

+0

Tôi vừa thêm một số làm rõ. Tôi đang cố gắng tìm ra cú pháp tìm đúng để sử dụng. – Leddo

Trả lời

12

Bạn có thể đếm số lượng bản ghi có giá trị current_score cao hơn. Bạn vẫn sẽ phải làm điều đó cho mỗi bản ghi (hoặc làm một truy vấn phụ trong sql của bạn).

class Score < ActiveRecord::Base 

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

end 
+0

Thật hoàn hảo! Tôi chỉ thực hiện một thay đổi để +1 để xếp hạng như thể có 0 điểm lớn hơn xếp hạng của tôi sẽ là 1 thay vì 0. Bạn Rock! – Leddo

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

Tôi đang cố gắng tìm ra thứ hạng của một người chơi cụ thể. Truy vấn của bạn sẽ chỉ sắp xếp chúng nếu tôi đúng. Tôi đã thêm một số làm rõ thêm cho câu hỏi. – Leddo

Các vấn đề liên quan