我希望我的网站用户能够看到他的朋友在不同问题上给出的答案(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
你的后端是一个传统的SQL数据库吗?这确实可能会“大规模”出现问题,这将导致潜在地优化这个w /单独的“friendship_stats”表,该表最终在“接近”实时的情况下一致/更新。 – Pete 2012-03-09 16:21:40
它是一个sqlite3,我开始发展。你的意思是我应该有一个'friendship_stats'表,它始终在后台运行上面的代码? – wachichornia 2012-03-09 17:00:15
不一定是“所有的时间”,但在后台的某个时间间隔,使用户会看到一个大致的最新版本。同样,用户在SO上的声誉在每次登录时都不会重新计算,因此有些事情可以计算一次并缓存。 – Pete 2012-03-09 17:33:46