如何平衡实例方法返回的值以进行收集?

时间:2014-07-03 14:12:48

标签: ruby integer instance average

我在模型中有一个简单的方法:

def term_months
  ((started_at - injected_at) / 1.month).to_i
end

返回一个简单的整数。

在我的视图中,我有一个此模型类型的集合,我想平均每个模型的term_months值的结果。

如果这是一个专栏,我可以使用类似@terms.average(:term_months)的内容,但事实并非如此。

有没有办法将它们内联到平均值?

3 个答案:

答案 0 :(得分:1)

您必须使用地图手动执行此操作:

@terms.map(&:term_months).inject(:+).to_f / @terms.length

您可以做的是将其定义为Term

上的类方法
def self.average_term_months
  scoped.map(&:term_months).inject(:+).to_f / scoped.length
end

并将其用作@terms.average_term_months

此方法不能用作经典类方法,而更多用作范围。但是我没有将它定义为范围,因为(这里的个人品味)我希望范围可以链接。

答案 1 :(得分:1)

@terms.sum(&:term_months).to_f / @terms.size

如果started_atinjected_at是您的数据库中的列,那么下面的代码可能会比使用Enumerable方法(:sum)更好,因为它会委派< em>平均到DB并返回一个整数/浮点对象,然后不需要term_months

Model.average("(started_at - injected_at)/ #{1.month}") #where Model is the name of your ActiveRecord Object

答案 2 :(得分:0)

您可以考虑使用quickstats gem,它旨在随着新的观察结果在观察的基础上更新观察的基本统计数据。如果数据集很大并且您只需要摘要统计数据而不必保留所有单独的观察结果,这可能非常有用。 Quickstats使用递归关系Xbar(n+1) <- f(Xbar(1), x_n)s^2(n+1) <- g(s^2(n), x_n),其中Xbar(n)s^2(n)分别基于n观察值的平均值和样本方差; x_n是n th 观察; fg代表相应的更新功能。