Rails average - 仅在值<>时收集0

时间:2011-03-14 16:47:51

标签: ruby-on-rails ruby-on-rails-3

我正在使用此代码计算某些数字的平均值 - 请注意,rankings列已序列化并包含哈希:

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

此代码的缺点是:如果其中一个值为nil,则平均值计算为好像它存在为零。问题基本上是@reviews.length分母假设每个评论都有相关价值。

如何从分母中排除那些不计算的评论?


非常感谢您的回答。问题最终出现在分母上,即/@reviews.length部分。当我在分子和分母上使用reject时,等式停止除以总长度并开始除以(长度 - 没有nils)。

最终结果 - 2分[0和100]平均为50; [零和100]平均为100。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我会采用这种方法(使用compact来杀死nil):

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

答案 2 :(得分:1)

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