2012-10-06 77 views
0

我试图得到产品表中的价格平均值并将其存储在一个名为平均值的变量中。Rails每个都做平均

继承人我的代码:

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

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

    average = average/i 
end 

即时得到错误 “未定义的方法'+”近亲:NilClass” 上的 “I + = 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的好方法。

+0

感谢。我以为你必须用@符号声明所有的变量。我是一个试图学习ruby的java程序员 – user1352609

+1

啊,有道理。我相信你知道区别,但是为了其他人阅读的目的:'@'表示一个实例变量,即一个存在于整个对象范围内的变量。使用的另一种类型的变量(sans-'@')仅在最“本地”范围内可用。但正如我所说,这是计算平均值的一种非常低效的方式,但这是一个好的开始。 –

2

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

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

@average = Product.average(:price) 

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

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

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

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

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

     @average = @average/@i 
    end