2011-03-14 17 views
2

我正在使用此代碼來計算一些數的平均值 - 注意,rankings列是序列化和包含哈希:Rails的平均 - 收集僅當值<> 0

@reviews.collect{|review| review.rankings[label].to_i}.sum.to_f/@reviews.length if @reviews.length > 0 

與此缺點代碼是這樣的:如果其中一個值是nil,則平均值計算爲它存在爲零。問題基本上是分母@reviews.length假定每個評論都有相關的價值。

如何從分母中排除那些不計算在內的評論?


非常感謝您的回答。問題最終與分母一起出現,即/@reviews.length部分。當我在分子和分母上都使用reject時,等式停止除以總長度,並開始除以(長度 - 零)。

最終結果-2分數[0和100]平均爲50; [無和100]的平均值爲100.

回答

1

Array#reject來救援。

@reviews.reject{|review| review.rankings[label].nil?}.collect{|review| review.rankings[label].to_i}.sum.to_f/@reviews.length if @reviews.length > 0 
+0

不太但我設法得到它的工作按我上面的回覆。無論如何我都接受。非常感謝! – sscirrus 2011-03-15 06:42:35

1

我會去與方法(使用compactnil S):

rankings = @reviews.map{ |review| review.rankings[label] }.compact 
rankings.map(&:to_i).sum.to_f/rankings.count unless rankings.count == 0 
+0

非常感謝Marcel – sscirrus 2011-03-15 06:43:31

1
if @reviews.length > 0 
    @reviews.collect{|r| r.rankings[label]}.compact.map(&:to_f).sum/@reviews.length 
    else 
    0 
    end 
+0

感謝您的回答Julik – sscirrus 2011-03-15 06:42:53