2016-03-28 30 views
0

によってアクティブレコード協会関係を合計し、I:レールは、私が<code>Foo::ActiveRecord_AssociationRelation</code>を持って

.inject(0){|sum,x| x.dimension == dimension && x.dimension_value == dimension_value && x.metric == metric ? (sum += x.metric_value) :()} 

私はそれを返す必要があります期待合計値を取得します。私がモデルに

def self.sum_by(dimension, dimension_value, metric) 
... 
end 

をこのコードを追加したとき

は、しかし、私はこのエラーを取得する:

NoMethodError: undefined method `inject' for #<Class:0x000000094cbbd0> 

私が正しくそのコードを適用するにはどうすればよいですか? FooActiveRecord::Baseから継承されているとすれば、うまくいくはずです。

+0

'where'節として表現できず、' sum'を使用することはできませんか? – tadman

+0

それは私が本当にやったことです。 – Killerpixler

答えて

3

私はあなたがクラスにコピーするときに先頭の期間を削除していると仮定しています。

しかし、injectはActiveRecord :: Baseオブジェクトのメソッドではありません。これはEnumerableモジュールからのものであるため、列挙可能なモジュールが混在しているもので呼び出す必要があります。

たとえば、Fooのすべてのインスタンスを合計しようとすると、Foo.allを最初に呼び出すことができますすべてのオブジェクトの配列を返します。あなたのコードは次のようになります。

def self.sum_by(dimension, dimension_value, metric) 
    Foo.all.inject(0){|sum, a_foo| foo.dimension == dimension && foo.dimension_value == dimension_value && foo.metric == metric ? (sum += foo.metric_value) :()} 
end 
+0

実際にはスコープ:sum_by、 - >(dimension、dimension_value、metric){where(dimension:dimension、dimension_value:dimension_value、metric:metric).sum(:metric_value)} 'に変更されました。ありがとう! – Killerpixler

関連する問題