2012-03-09 134 views
3

我希望我的網站用戶能夠看到他的朋友在不同問題上給出的答案(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 
+0

你的後端是一個傳統的SQL數據庫嗎?這確實可能會「大規模」出現問題,這將導致潛在地優化這個w /單獨的「friendship_stats」表,該表最終在「接近」實時的情況下一致/更新。 – Pete 2012-03-09 16:21:40

+0

它是一個sqlite3,我開始發展。你的意思是我應該有一個'friendship_stats'表,它始終在後臺運行上面的代碼? – wachichornia 2012-03-09 17:00:15

+0

不一定是「所有的時間」,但在後臺的某個時間間隔,使用戶會看到一個大致的最新版本。同樣,用戶在SO上的聲譽在每次登錄時都不會重新計算,因此有些事情可以計算一次並緩存。 – Pete 2012-03-09 17:33:46

回答

1

friendships.answers.each 

應該工作,因爲你有你的關係正確設置(has_many,belongs_to)

0

的內在邏輯是有點複雜,但可以使用#flat_map減少深度的一層:

friendships.flat_map { |f| Answer.find_by_friendship_id f.id }.each do |answer| 
    q_and_a.each do |array| 
    # Blah blah. 
    end 
end