将对象数组转换为注入和的数字

时间:2011-12-19 16:17:46

标签: ruby ruby-on-rails-3

我正在使用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 个答案:

答案 0 :(得分:2)

AR / SQL(更快):

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

Ruby(慢):

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

答案 1 :(得分: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