我在模型中有一个简单的方法:
def term_months
((started_at - injected_at) / 1.month).to_i
end
返回一个简单的整数。
在我的视图中,我有一个此模型类型的集合,我想平均每个模型的term_months
值的结果。
如果这是一个专栏,我可以使用类似@terms.average(:term_months)
的内容,但事实并非如此。
有没有办法将它们内联到平均值?
答案 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_at
和injected_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 观察; f
和g
代表相应的更新功能。