2009-06-12 16 views
5

क्या संग्रह में किसी विशेषता का औसत प्राप्त करने का कोई आसान तरीका है?रेल क्षेत्र औसत पर रूबी?

उदाहरण के लिए, प्रत्येक उपयोगकर्ता के पास स्कोर होता है।

उपयोगकर्ता (ओं) (@users) के संग्रह को देखते हुए, आप समूह के लिए औसत स्कोर कैसे प्राप्त कर सकते हैं?

क्या @ user.average (स्कोर) जैसे कुछ भी है? मुझे लगता है मैं डेटाबेस क्षेत्रों के लिए कुछ इस तरह भर में आया लगता है, लेकिन मैं एक संग्रह के लिए काम करने के लिए ...

उत्तर

12

अपने प्रश्न के लिए इसकी आवश्यकता है, एक वास्तव में कर सकता है:

@users.collect(&:score).sum.to_f/@users.length if @users.length > 0 

इससे पहले मैंने सोचा, @users .collect (&: स्कोर)। औसत काम किया होगा। डेटाबेस फ़ील्ड के लिए, User.average (: स्कोर) काम करेगा। आप यह भी जोड़ सकते हैं: अन्य Activerecord प्रश्नों की तरह स्थितियां।

+0

बहुत अच्छा उपयोग कर सकते हैं। & In &: स्कोर क्या करता है? – David

+0

एम्पर्सेंड ऑपरेटर के लिए एक विकल्प है: @ users.collect {| उपयोगकर्ता | user.score} वेब पर इसके बारे में और पढ़ें: http://eli.thegreenplace.net/2006/04/18/understanding-ruby-blocks-procs-and-methods/ –

+0

बहुत बढ़िया। डेटाबेस फ़ील्ड उदाहरण के लिए –

2

मैं इस विधि के साथ हमारे दोस्त सरणी का विस्तार करने का उपयोग करें:

class Array 
    # Calculates average of anything that responds to :"+" and :to_f 
    def avg 
    blank? and 0.0 or sum.to_f/size 
    end 
end 
2

यह एक छोटा सा टुकड़ा न केवल औसत लेकिन यह भी मानक विचलन प्राप्त करने के लिए है।

class User 
    attr_accessor :score 
    def initialize(score) 
    @score = score 
    end 
end 

@users=[User.new(10), User.new(20), User.new(30), User.new(40)] 

[email protected](0){|acc, user| acc + user.score}/@users.length.to_f 
stddev = Math.sqrt(@users.inject(0) { |sum, u| sum + (u.score - mean) ** 2 }/@users.length.to_f) 
संबंधित मुद्दे