Ruby 如何计算实例方法返回的集合值的平均值?

Ruby 如何计算实例方法返回的集合值的平均值?,ruby,integer,instance,average,Ruby,Integer,Instance,Average,我在模型中有一个简单的方法: def term_months ((started_at - injected_at) / 1.month).to_i end 这将返回一个简单的整数 在我看来,我有一个这种模型类型的集合,我想平均出每个模型的期月值的结果 如果这是一个列,我可以使用类似于@terms.average(:term\u months)的内容,但事实并非如此 有什么方法可以在线平均它们吗?您必须使用地图手动进行此操作: @terms.map(&:term_months).i

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

def term_months
  ((started_at - injected_at) / 1.month).to_i
end
这将返回一个简单的整数

在我看来,我有一个这种模型类型的集合,我想平均出每个模型的
期月
值的结果

如果这是一个列,我可以使用类似于
@terms.average(:term\u months)
的内容,但事实并非如此


有什么方法可以在线平均它们吗?

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

@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.sum(&:term_months).to_f / @terms.size
如果数据库中的列是
start_at
injected_at
,那么下面的方法可能比使用
Enumerable
方法(
:sum
)具有更好的性能,因为它将平均值委托给数据库,只返回一个整数/浮点对象,那么就不需要
term\u monds

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

你可以考虑使用这个方法,它是根据观测结果更新观测数据的基础统计数据。如果数据集很大,并且您只需要摘要统计数据,而不必保留所有单个观察值,那么这将非常有用。Quickstats使用递归关系

Xbar(n+1)。第一个位有效,但第二个类方法在Term上无效。self.map会针对单个术语实例调用它,对吗?不是实际的集合。@Serg-class方法也适用于集合(假设您有一个ActiveRecord::Relation集合,而不是模型数组),我的@terms集合只是一个简单的
@terms=Term.order(“在DESC创建”)
-第二位不起作用。@Serg-order返回ActiveRecord::Relation,所以它应该起作用。你有什么错误?请尝试将
self
更改为
scoped
@BroiSatse和serg您是对的,我更新了答案。@bjhaid-它不起作用,terms\u month不是一个列,而是一个自定义方法。@BroiSatse在这种情况下不起作用的
sum
是,而不是ActiveRecord sum,因此它对方法calls有效第一个参数是identity,默认为0,不能为符号。也许你的意思是
sum(&:term\u months)
谢谢,我的坏孩子错过了
&
,但是第二个选项是最理想的OP答案