rails

时间:2016-03-28 19:11:10

标签: ruby-on-rails ruby rails-activerecord

当我在控制台中运行此代码时,我有Foo::ActiveRecord_AssociationRelation和我:

.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>

如何正确应用该代码?鉴于Foo继承自ActiveRecord::Base,我认为它应该有用。

1 个答案:

答案 0 :(得分: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