2011-12-19 17 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 = Review.select("rating").where("reviewable_id = ?", self.reviewable_id)其中all_rating返回對象的數組,象下面這樣:

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

我不能做任何算術計算它。我需要它是一組數字,然後才能使用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 2011-12-19 16:46:44

+0

在第二種情況下也可能是'..)。to_a.sum(&:rating)',可能會節省一些內存。 – 2011-12-19 18:30:18

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