2009-06-12 10 views
5

Czy istnieje prosty sposób na uzyskanie średniej atrybutu w kolekcji?Średnia rubinowa na Railsach?

Na przykład każdy użytkownik ma wynik.

Biorąc pod uwagę kolekcji użytkownika (S) (@users), w jaki sposób można uzyskać średni wynik dla grupy?

Czy istnieje coś takiego jak @ users.average (: score)? Myślę, że natknąłem się na coś takiego pól bazy danych, ale potrzebuję go do pracy dla kolekcji ...

Odpowiedz

12

za pytanie, można rzeczywiście zrobić:

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

Wcześniej myślałem, @users .collect (&: score). Pomoc byłaby udana. Dla pól bazy danych będzie działać User.average (: score). Możesz również dodać: warunki, takie jak inne zapytania activerecord.

+0

bardzo miłe. Do czego służy funkcja & in &: score? – David

+0

Operator ampersand jest zamiennikiem dla: @ users.collect {| user | user.score} Dowiedz się więcej na ten temat w Internecie: http://eli.thegreenplace.net/2006/04/18/understanding-ruby-blocks-procs-and-methods/ –

+0

całkiem niesamowite. –

2

używam przedłużyć nasz przyjaciel Array z tą metodą:

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

Oto mały fragment, aby nie tylko uzyskać średni, ale także odchylenie standardowe.

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)