Среднее значение поля Ruby on Rails?

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

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

Учитывая коллекцию пользователей (@users), как вы можете получить средний балл для группы?

Есть ли что-нибудь вроде @users.average(: score)? Я думаю, что мне удалось найти что-то подобное для полей базы данных, но мне нужно, чтобы он работал для коллекции...

Ответ 1

Для вашего вопроса, на самом деле можно:

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

Раньше я думал, что @users.collect(&: score). average работал бы. Для полей базы данных будет использоваться User.average(: score). Вы также можете добавить такие условия, как другие запросы activerecord.

Ответ 2

Я использую для расширения нашего друга Array с помощью этого метода:

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

Ответ 3

Здесь немного фрагмента, чтобы не только получить среднее, но и стандартное отклонение.

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 )