2012-08-04 32 views
0

我想用下面的公式計算每個我的產品的貝葉斯評分的基礎上,他們的得分(0-100)和票數:創建平均貝葉斯對每個產品的

( (avg_num_votes * AVG_RATING)+(this_num_votes * this_rating))/ (avg_num_votes + this_num_votes)

每個產品的has_many的評價,並且每個評論具有 '得分',這是0-100。

當從數據庫中提取產品列表時,計算視圖中的表格中列出的貝葉斯分數的最佳方法是什麼?

編輯:我在尋找沿着線的東西:

Product.each do |product| 
    @product_bayesian = ((Review.count * Review.average(:score)) + (product.reviews.count + product.reviews.average(:score))/(Review.count+product.reviews.count) 
end 

但是,在最有效的方式完成的,可能是通過在控制器中加入?

+0

當你說票,將每次審查等同於投票? – TangoKilo 2012-08-04 09:09:46

+0

是的,抱歉缺乏澄清... Review.count會=票數 – Abram 2012-08-04 09:10:38

回答

0

這裏是我的解決方案:

def overall 
    @products = Product.all 
    @overall_count = Review.count 
    @overall_average = Review.average(:score) 
    @unranked = {} 

    @products.each do |product| 
     @review_score_raw = product.reviews.average(:score) 
     @review_score = @review_score_raw.to_int if @review_score_raw 
     @review_count = product.reviews.count 

     if product.reviews.count == 0 
     @bayesian = 0 
     else 
      @bayesian = (((@overall_count * @overall_average) + (@review_count * @review_score_raw))/(@overall_count + @review_count)) 
     end 

     @unranked[product] = @bayesian 
    end 

    @ranked = @unranked.sort_by {|key, value| value}.reverse.each_with_index.to_a 
end