2009-06-12 127 views
5

有没有简单的方法来获得集合中属性的平均值?Ruby on Rails平均水平?

例如,每个用户都有一个分数。

鉴于用户集合(@users),您如何获得该组的平均分数?

有没有像@ users.average(:score)的东西?我觉得我碰到这样的事情对于数据库字段来了,但我需要它的采集工作...

回答

12

对于你的问题,我们可以真正做到:

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

早些时候我想,@users .collect(&:分数)。平均值工作。对于数据库字段,User.average(:score)将起作用。您还可以添加:像其他activerecord查询一样的条件。

+0

很不错的。 &in&:得分是做什么的? – David 2009-06-12 05:12:19

+0

&符号运算符是@ users.collect {| user | user.score} 了解了更多关于它的网站: http://eli.thegreenplace.net/2006/04/18/understanding-ruby-blocks-procs-and-methods/ – 2009-06-12 05:22:23

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)