2013-02-08 111 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