2009-06-12 13 views
5

Есть ли простой способ получить среднее значение атрибута в коллекции?Рубин на рельсах средний?

Например, у каждого пользователя есть оценка.

Учитывая коллекцию пользователей (@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 &: score? – David

+0

Оператор амперсанда заменяет: @ users.collect {| user | 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) 
Смежные вопросы