Среднее значение поля 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 )
Ответ 4
u может использовать это здесь
http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-average