我试图获得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”
答案 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