2012-03-09 104 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