Я хочу, чтобы пользователь моего сайта видел среднее количество ответов (от 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