2

モデル内の 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 に答える