2009-06-12 43 views
5

¿Hay una manera fácil de obtener el promedio de un atributo en una colección?Ruby on Rails field average?

Por ejemplo, cada usuario tiene un puntaje.

Dada una colección de usuarios (@users), ¿cómo se puede obtener el puntaje promedio del grupo?

¿Hay algo como @ users.average (: puntuación)? Creo que me encontré con algo como esto para los campos de la base, pero lo necesito para trabajar para una colección ...

Respuesta

12

Por su pregunta, uno podía hacer:

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

Anteriormente pensé, @users .collect (&: puntaje) .average habría funcionado. Para los campos de la base de datos, User.average (: score) funcionará. También puede agregar: condiciones como otras consultas Activerecord.

+0

muy agradable. ¿Qué hace el & in &: score? – David

+0

El operador de y comercial es un sustituto de: @ users.collect {| user | user.score} Lea más sobre esto en la web: http://eli.thegreenplace.net/2006/04/18/understanding-ruby-blocks-procs-and-methods/ –

+0

pretty awesome. –

2

utilizo para extender nuestro amigo matriz con este método:

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 
2

aquí hay un pequeño fragmento, no sólo para obtener el promedio, sino también la desviación estándar.

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)