Ruby on rails 每个轨道的平均值

Ruby on rails 每个轨道的平均值,ruby-on-rails,ruby,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:Nil

我试图在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的方法”

您正在将
i
设置为实例变量(
@i
),但将其作为常规变量调用(
i

@
初始化为零时,请将其删除,或者将对
i
的引用更改为
@i

在这个方法之后,您可能不想重复使用
i
,所以您可能只需要一个正则变量。像这样。(您的
@average
也有类似的问题,您可能希望在使用该方法后保持该问题。)


有一种更简洁的方法可以计算ActiveRecord集合的平均值(您可以直接在SQL中进行),但我不会提及这些,因为您所做的可能是学习Ruby的一种好方法。

您将
I
设置为实例变量(
@I
),但将其作为常规变量调用(
i

@
初始化为零时,请将其删除,或者将对
i
的引用更改为
@i

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


有一种更简洁的方法可以计算ActiveRecord集合的平均值(您可以直接在SQL中进行计算),但我不会提及这些,因为您所做的可能是学习Ruby的一种好方法。

在RubyonRails中,有预定义的模型来计算平均值、总和、计数、最小值、最大值等

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

@average = Product.average(:price)
它将把实际工作分派给SQL,SQL比Ruby代码做得更好。它将生成一个SQL查询,如(这是一个MySQL示例):


在RubyonRails中,有预定义的模型来计算平均值、总和、计数、最小值、最大值等

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

@average = Product.average(:price)
它将把实际工作分派给SQL,SQL比Ruby代码做得更好。它将生成一个SQL查询,如(这是一个MySQL示例):


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

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

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

        @average = @average / @i
    end

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

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

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

        @average = @average / @i
    end

谢谢。我以为你必须用@符号声明所有变量。我是一个试图学习rubyAh的java程序员,这是有道理的。我相信你知道区别,但为了其他人阅读:
@
表示一个实例变量,即存在于整个对象范围内的变量。另一种类型的变量是我们ed(SAN-
@
)仅在最“本地”的范围。正如我所说,虽然这是一种计算平均值的非常低效的方法,但这是一个很好的开始。谢谢。我以为你必须用@符号声明所有变量。我是一个试图学习rubyAh的java程序员,这很有意义。我相信你知道其中的区别,但对于其他人来说:
@
表示一个实例变量e、 也就是说,存在于整个对象范围内的变量。使用的另一种类型的变量(sans-
@
)仅在最“局部”的范围内可用。尽管如此,正如我所说,这是计算平均值的一种非常低效的方法,但这是一个良好的开端。