2011-12-19 2 views
0

Ruby 1.9.2, Rails 3.1을 사용하고 있습니다. 나는 다음과 같은 한 :오브젝트 배열을 숫자로 변환합니다.

# review.rb 
def calculate_rating 
    all_rating = Review.select("rating").where("reviewable_id = ?", self.reviewable_id) 
    all_rating.inject(:+) 
end 

# reviews_controller.rb 
def create 
    @reviewable = find_reviewable 
    @review = @reviewable.reviews.where("user_id = ?", current_user).first 
    if @review.save 
    @review.calculate_rating 
    redirect_to :id => nil 
    else 
    flash[:error] = 'Error saving review. Please try again.' 
    redirect_to :id => nil 
    end 
end 

이 뒤에 아이디어는 평가와 새로운 검토를 제출하고 저장 될 때, 그것은 모든 @reviewable에 대한 모든 평가를 찾을 평가의 총 수에 의해 모든 등급 및 분할 합계 것입니다 . all_rating 오브젝트의 배열을 반환 all_rating = Review.select("rating").where("reviewable_id = ?", self.reviewable_id), 아래와 같이 :

[#<Review rating: #<BigDecimal:1050f0a40,'0.3E1',9(18)>>, #<Review rating: #<BigDecimal:1050f0928,'0.1E1',9(18)>>] 

I 그것에 산술 연산을 수행 할 수없는 I가 현재 직면하고

문제점이 라인이다. inject을 사용하여 합계를 계산하고 등급의 수로 나눌 수 있기 전에 숫자의 배열이 필요합니다.

나는 inject 작동시킬 수있는 방법을 나에게 알려 주시기 바랍니다. 많은 감사합니다!

답변

2

AR/SQL (빠르게) :

Review.select("rating").where(:reviewable_id => self.reviewable_id).sum(:rating) 

루비 (느리게) :

Review.select("rating").where(:reviewable_id => self.reviewable_id).map(&:rating).sum 
+1

을 나는 당신이 ('지도를 의미 생각 : 등급)'. – qerub

+0

두 번째 경우에는'..). to_a.sum (& : rating)'이 될 수도 있습니다. 아마도 약간의 메모리가 절약 될 것입니다. –

0

그냥이 일에 대해 어떻게 :

def calculate_rating 
    all_rating = Review.select(:rating).where(:reviewable_id => reviewable_id).map(&:rating) 
    all_rating.inject(:+) # or you could just do all_rating.sum 
end 
관련 문제