2

我正在尝试根据模型中的第二个变量计算模型中变量的加权平均值,但我无法通过 ActiveRecord 找到方法。

class Employer < ActiveRecord::Base
  attr_accessible :name, :number_of_employees, :average_age

  def self.wt_avg_age
    #return sum(number_of_employee * average_age)/sum(number_of_employees)
  end
end 

在直接 SQL 中,我会使用:

SELECT id, SUM(number_of_employees*average_age)/SUM(number_of_employees) 
FROM employer
GROUP BY name    

我能否以雄辩的方式在 ActiveRecord 关系上执行类似的操作(即,无需拉下单独的数组并遍历每条记录以获取我的分子)?我尝试了使用 .select()、.pluck() 和 sum() 的不同组合,但没有任何运气。我无法让 ActiveRecord 对象执行 sumproduct。

4

3 回答 3

1

您应该能够执行以下操作:

Employer.select("name, (SUM(number_of_employees*average_age)/SUM(number_of_employees)) as sum").group(:name)

这会将 Employer 实例返回给您,但它们将只有 .name 和 .sum 属性。这将运行您想要的确切 SQL 查询。

于 2012-11-13T21:13:17.233 回答
1

看起来ActiveRecord::Calculations#sum需要一个块:

# File activerecord/lib/active_record/relation/calculations.rb, line 92
def sum(*args)
  if block_given?
    self.to_a.sum(*args) {|*block_args| yield(*block_args)}
  else
    calculate(:sum, *args)
  end
end

(另见http://api.rubyonrails.org/classes/Enumerable.html#method-i-sum

所以你可以试试:

def self.wt_avg_age
  numerator = self.all.sum { |e| e.number_of_employee * e.average_age }
  denominator = self.sum :number_of_employees
  return numerator / denominator
end
于 2012-11-13T21:17:59.687 回答
0

试一试,也许它可以工作:

def self.wt_avg_age
  a = Employer.sum("number_of_employee * average_age")
  b = Employer.sum('number_of_employees')
  a/b
end
于 2012-11-13T21:10:59.413 回答