Ruby on Rails moyenne sur le terrain?
-
13-09-2019 - |
Question
Y at-il un moyen facile d'obtenir la moyenne d'un attribut dans une collection?
Par exemple, chaque utilisateur a un score.
Étant donné une collection de l'utilisateur (s) (@users), comment pouvez-vous obtenir la note moyenne pour le groupe?
Y at-il quelque chose comme @ users.average (: score)? Je pense que je suis tombé sur quelque chose comme ça pour les champs de base de données, mais je besoin de travailler pour une collection ...
La solution
Pour votre question, on pourrait réellement faire:
@users.collect(&:score).sum.to_f/@users.length if @users.length > 0
Un peu plus tôt que je pensais, @ users.collect (&: score) .Moyenne aurait travaillé. Pour les champs de la base de données, User.average (: score) fonctionnera. Vous pouvez également ajouter:. Conditions comme les autres requêtes activerecord
Autres conseils
Je l'utilise pour étendre notre ami tableau avec cette méthode:
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
Voici un petit extrait pour obtenir non seulement la moyenne, mais aussi l'écart-type.
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 )
u peut utiliser ici
http://api.rubyonrails.org/classes/ ActiveRecord / Calculations.html # méthode i moyenne