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 ...

Était-ce utile?

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 )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top