2010-09-14 14 views
6

द्वारा ऑर्डर के साथ मॉडल से पंक्ति संख्या कैसे प्राप्त करें मैं इसमें एक छोटा ऐप डाल रहा हूं जिसमें इसमें लीडरबोर्ड अवधारणा है। असल में, मॉडल सिर्फ एक खिलाड़ी_नाम और एक current_score है।रेल 3 -

जो मैं करना चाहता हूं वह एक विशिष्ट खिलाड़ी की रैंकिंग प्राप्त करना है, और यह देखते हुए कि नए स्कोर हर समय आ रहे हैं, इसे गतिशील होना चाहिए। जाहिर है, मैं क्लॉज द्वारा ऑर्डर के साथ सामान्य खोज कर सकता हूं और फिर मुझे प्रत्येक रिकॉर्ड के माध्यम से लूप करना होगा। जब मैं 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 

संपादित उदाहरण के लिए, तो मैं निम्नलिखित:

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

मैं कैसे की "डोनाल्ड लुईस" रैंकिंग काम कर सकते हैं ?

+0

अच्छा सवाल है, लेकिन यह एक रूबी सवाल से डेटा संरचनाओं और एल्गोरिदम प्रश्न की तरह लगता है। –

+0

मैंने अभी कुछ स्पष्टीकरण जोड़ा है। मैं उपयोग करने के लिए सही खोज वाक्यविन्यास काम करने की कोशिश कर रहा हूँ। – Leddo

उत्तर

12

आप उच्च वर्तमान_स्कॉर्ड्स वाले रिकॉर्ड्स की संख्या को गिन सकते हैं। आपको अभी भी प्रति रिकॉर्ड करना होगा (या अपने एसक्यूएल में उप-क्वेरी करें)।

class Score < ActiveRecord::Base 

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

end 
+0

यह सही है! मैंने रैंकिंग में +1 में बदलाव किया है, जैसे कि मेरी रैंकिंग से 0 अंक अधिक 0 के बजाय 1 होगा। आप रॉक! – Leddo

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

मैं किसी विशेष खिलाड़ी की रैंकिंग को बाहर करने की कोशिश कर रहा हूं। यदि मैं सही हूं तो आपकी क्वेरी बस उन्हें सॉर्ट करेगी। मैंने प्रश्न के लिए कुछ और स्पष्टीकरण जोड़ा। – Leddo