Цикл внутри цикла внутри цикла на Ruby on Rails - PullRequest
3 голосов
/ 09 марта 2012

Я хочу, чтобы пользователь моего сайта видел среднее количество ответов (от 1 до 100), которые его друзья дали ему на разные вопросы.

Окончательный результат этого метода - массив с [вопрос, сумма всех ответов, количество ответов]

3 таблицы, каждая со своим контроллером и моделью

У меня есть таблица «Friendship», в которой хранятся пользователи и друзья.

Тогда есть таблица вопросов, в которой есть только вопросы и их идентификаторы.

Наконец, у меня есть таблица ответов, в которой хранятся идентификатор дружбы, идентификатор вопроса и ответ.

Я нашел способ сделать это (хотя еще не пробовал): я ищу друзей пользователя, затем ищу ответы, данные каждой из этих дружеских связей, затем просматриваю каждый вопрос, чтобы добавить его в окончательный массив.

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

Плюс конфиг на дружбу.rb

has_many :relationships
has_many :answers, :through => :relationships

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Хорошо

friendships.answers.each

должно работать, учитывая, что ваши отношения установлены правильно (has_many, Proper_to)

0 голосов
/ 09 марта 2012

Внутренняя логика немного сложнее, но вы можете уменьшить один уровень глубины, используя # 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
...