0

商品テーブルで価格の平均を取得し、それを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の未定義メソッド`+'」というエラーが発生します

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として設定していますが、通常の変数()として呼び出しています。@ii

@をゼロに初期化するときに削除するか、参照を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 に答える