我希望我的網站用戶能夠看到他的朋友在不同問題上給出的答案(1到100)的平均值。Ruby on Rails循環內的循環
該方法的最終結果是具有[問題,所有答案的總和,答案計數]
3個表都參與其中,每一個與它自己的控制器和模型
我有一個表的陣列'友誼',存儲用戶和朋友。
然後有一個問題表,其中只有問題和它的ID。
最後,我有一個答案表,它存儲友誼ID,問題ID和給出的答案。
我找到了一種方法來做到這一點(雖然還沒有嘗試過):我尋找用戶的友誼,然後尋找這些友誼給出的答案,然後通過每個問題來添加它到最後一個數組。
q_and_a = Array.new
friendships = Friendship.find_by_user_id(current_user.id)
friendships.each do |friendship|
answers = Answer.find_by_friendship_id(friendship.id)
answers.each do |answer|
q_and_a.each do |array|
question = Question.find_by_id(answer.question_id)
if array[0] == statement.description
array[1] = array[1] + answer.value
array[2] = array[2] + 1
else
q_and_a << [ question.description, answer.value, 1 ]
end
end
end
end
它太可怕了,我希望有更好的方法來做到這一點?更考慮到友誼表,以及答案表,必然有成千上萬的記錄,並會繼續增長
編輯 如下所述,我有協會成立了,但我不使用它們!菜鳥的錯誤。 最後的工作代碼爲:
@q_and_a_them = Array.new
user_answers = current_user.friends.collect { |c| c.answers }.flatten
user_answers.each do |a|
question = Question.find_by_id(a.question_id)
if @q_and_a_them.empty?
@q_and_a_them << [ question.description, a.value, 1 ]
else
@q_and_a_them.each do |q|
if q[0] == question.description
q[1] = q[1] + a.value
q[2] = q[2] + 1
else
@q_and_a_them << [ question.description, a.value, 1 ]
end
end
end
end
加上friendship.rb的配置
has_many :relationships
has_many :answers, :through => :relationships
你的後端是一個傳統的SQL數據庫嗎?這確實可能會「大規模」出現問題,這將導致潛在地優化這個w /單獨的「friendship_stats」表,該表最終在「接近」實時的情況下一致/更新。 – Pete 2012-03-09 16:21:40
它是一個sqlite3,我開始發展。你的意思是我應該有一個'friendship_stats'表,它始終在後臺運行上面的代碼? – wachichornia 2012-03-09 17:00:15
不一定是「所有的時間」,但在後臺的某個時間間隔,使用戶會看到一個大致的最新版本。同樣,用戶在SO上的聲譽在每次登錄時都不會重新計算,因此有些事情可以計算一次並緩存。 – Pete 2012-03-09 17:33:46