2012-10-06 8 views
0

제품 테이블에서 평균 가격을 얻고 평균이라는 변수에 저장하려고합니다. Heres는레일스는 각각 평균을 수행합니다

내 코드 :

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

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

    average = average/i 
end 

임 점점 오류 "정의되지 않은 메서드`+ '무기 호에 대한 : NilClass"는 "내가 + = 1 문"당신이로 i을 설정하는

답변

1

인스턴스 변수 (@i)이지만 일반 변수 (i)로 호출합니다.

0으로 초기화 할 때 @을 삭제하거나 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 

이 (당신이 일을 할 수있는 액티브 컬렉션에서 평균 운동의 훨씬 청소기 방법이있다 SQL에서 직접적으로), 당신이하고있는 일이 아마도 Ruby를 배우는 좋은 방법 일 것이기 때문에 언급하지 않을 것입니다.

@average = Product.average(:price) 
: 당신의 모델은 특별한 경우,

을 등 최소, 최대, 평균, 합계를 계산 계산하는 루비 온 레일즈에서

+0

감사에 서명. 모든 변수를 @ 기호로 선언해야한다고 생각했습니다. 루마니아어를 배우려고 노력하는 자바 프로그래머 – user1352609

+1

아, 말이 되네. 차이점을 알고있을 것입니다 만, 다른 누구나 읽을 목적으로 :'@'는 인스턴스 변수, 즉 전체 객체의 범위 내에 존재하는 변수를 나타냅니다. 사용되는 다른 유형의 변수 (sans-'@')는 가장 "로컬"범위에서만 사용할 수 있습니다. 나가 말한대로, 이것은 평균을 운동하는 매우 비효율적 인 방법이다, 그러나 좋은 시작이다. –

2

aggregate methods 미리 정의가 다음을 수행 할 수 있습니다

Ruby 코드보다 더 잘 작동 할 SQL에 실제 작업을 전달합니다. 그것은 (이것은 MySQL의 예이다)와 같은 SQL 쿼리를 생성합니다 :

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 
관련 문제