2013-02-08 112 views
1

我必须计算出的平均的方法对于给定的记录:Rails的元素添加到阵列

input = params[:recommendation_ratings].values # The params are sent from radio_tags in my view. 

input.each do |mini_params| 
rating_id = mini_params[:rating_id] 
l = Rating.find(rating_id) #Find record on Rating table. 
l.rating #Get value associated with rating_id 
total_rating = [] 
total_rating << l.rating 
average = total_rating.inject{ |sum, el| sum + el }.to_f/total_rating.size 
puts average 
end 

l.rating不被追加到total_rating阵列。正在打印的卖出期权平均为:

3.0 
3.0 
3.0 
3.0 
3.0 

如何附加每个评分的被返回到阵列以计算出的平均值,和其他数学函数。

+1

根据您的代码,total_rating将始终只有1个元素,因为您将其设置为空数组。 – jvnill

+0

我该如何改变,以便将每个评级添加到该空阵列中?谢谢! – Yogzzz

+0

你能更新代码并粘贴这个代码从哪里来的整个方法吗? – jvnill

回答

4

尝试:

total_rating = []  
input.each do |mini_params| 
    rating_id = mini_params[:rating_id] 
    l = Rating.find(rating_id) #Find record on Rating table. 
    total_rating << l.rating  
end 
average = total_rating.sum/total_rating.size.to_f 
0

您需要先获得所有您试图平均的评分。我假设你已经完成了这些操作,并且所有这些评级都存储在total_rating中。然后,你需要的特定分级添加到该数组:

rating_id = mini_params[:rating_id] 
l = Rating.find(rating_id) 
total_rating << l 
average = total_rating.sum.to_f/total_rating.size 
puts average 
2

这应该解决您的问题,但有一个更好的办法

total_rating = []  
input.each do |mini_params| 
    rating_id = mini_params[:rating_id] 
    l = Rating.find(rating_id) #Find record on Rating table. 
    total_rating << l.rating 
    average = total_rating.inject(:+).to_f/total_rating.size 
    puts average 
end 

所以给出一组ID,请尝试以下

Rating.where(id: mini_params[:rating_id]).average(:rating) 

UPDATE:固定一个行版本

rating_ids = input.map { |mini_params| mini_params[:rating_id] } 
Rating.where(id: rating_ids).average(:rating) 
+0

这给了我和以前一样的输出。 – Yogzzz

+0

也许你的意思是'Rating.where(“id in(?)”,input.map {| i | i [:rating_id]})。average(:rating)'? – nurettin

+0

yup nurettin,你说得对。我认为mini_params [:rating_id]是ids的数组。 – jvnill