Rails每个都做平均值

时间:2012-10-06 10:33:22

标签: ruby-on-rails ruby

我试图获得products表中的平均价格并将其存储在一个名为average的变量中。

继承我的代码:

def index
    @products = Product.all
    @average = 0
    @i = 0

    @products.each do |p|
       i += 1
       average += p.price
    end

    average = average / i
end

我在“i + = 1声明”中得到错误“未定义的方法`+'为nil:NilClass”

3 个答案:

答案 0 :(得分:2)

在Ruby on Rails中,模型有预定义aggregate methods来计算平均值,总和,计数,最小值,最大值等。

在您的特殊情况下,您可以执行以下操作:

@average = Product.average(:price)

它将实际工作分配给SQL,这将比Ruby代码做得更好。它会生成一个SQL查询(这是一个MySQL示例):

SELECT AVG(`products`.`price`) AS avg_id FROM `products`

答案 1 :(得分:1)

您将i设置为实例变量(@i),但将其称为常规变量(i)。

将初始值设为零时删除@,或将i的引用更改为@i

您可能不希望在此方法之后重复使用i,因此您可能只想要一个常规变量。像这样。 (你的@average也有类似的问题,你可能想要在方法之后保留。)

def index
    @products = Product.all
    @average = 0
    i = 0

    @products.each do |p|
       i += 1
       @average += p.price
    end

    @average = @average / i
end

有一种更简洁的方法来计算ActiveRecord集合的平均值(你可以直接在SQL中完成它),但我不会提到那些,因为你正在做的可能是学习Ruby的好方法。

答案 2 :(得分:0)

使用..我想你忘了@ sign

def index
        @products = Product.all
        @average = 0
        @i = 0

        @products.each do |p|
           @i += 1
           @average += p.price
        end

        @average = @average / @i
    end