0

我试图在产品表中获取价格的平均值并将其存储在一个名为平均值的变量中。

这是我的代码:

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 statement”上收到错误“undefined method `+' for nil:NilClass”

4

3 回答 3

2

在 Ruby on Rails 中,您的模型有预定义的聚合方法来计算平均值、总和、计数、最小值、最大值等。

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

@average = Product.average(:price)

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

SELECT AVG(`products`.`price`) AS avg_id FROM `products`
于 2012-10-06T10:38:43.530 回答
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 的好方法。

于 2012-10-06T10:35:18.590 回答
0

使用..我想你忘了@符号

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

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

        @average = @average / @i
    end
于 2012-10-06T10:41:50.707 回答