我正在使用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
工作。非常感谢!
答案 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