Среднее значение Ruby on Rails? - PullRequest
5 голосов
/ 12 июня 2009

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 12 июня 2009

На ваш вопрос можно было бы сделать:

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

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

2 голосов
/ 17 января 2011

Вы можете использовать это здесь

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-average

2 голосов
/ 12 июня 2009

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

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

mean=@users.inject(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 )
2 голосов
/ 12 июня 2009

Я использую, чтобы расширить наш массив 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
...