2011-12-19 10 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)>>] 

私はそれにすべての算術計算を行うことができない私は現在直面しています

問題は、このラインです。 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

2番目のケースでは、 '..)。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 
関連する問題