在Ruby on Rails上的循环内循环

时间:2012-03-09 15:56:24

标签: ruby-on-rails ruby arrays loops each

我希望我网站的用户能够看到他的朋友在不同问题上给出的答案的平均分数(1到100)。

此方法的最终结果是一个数组,其中包含[问题,所有答案的总和,答案计数]

涉及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

2 个答案:

答案 0 :(得分:1)

friendships.answers.each
假设您的关系设置正确(has_many,belongs_to)

应该有效

答案 1 :(得分: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