我有学生参加'测试',有5个'问题'。我想要做的是为每个测试显示每个问题的最大'得分'。
测试,学生,问题都是单独的表。
class Test < ActiveRecord::Base
has_many :students
end
class Student < ActiveRecord::Base
belongs_to :test
has_many :questions
end
class Question < ActiveRecord::Base
belongs_to :students
end
我的代码:
<% @tests.each do |test| %>
<% max_score = [] %>
<% test.students.collect {|s| s.questions.collect {|q| max_score << q.score}}%>
<tr>
<th><%= test.name %></th>
<th><%= max_score.max %></th
</tr>
<% end %>
然而,这显示的是整个测试的最高分数。
例)
Math - 95
History - 98
Physics - 100
它不会返回每个'question_number'1到5的最大值。我想为每个测试打印每个问题的最大分数。
例)
Math - 1 - 90
Math - 2 - 100
Math - 3 - 88
Math - 4 - 79
Math - 5 - 98
History - 1 - 80
History - 2 - 95
..and so on...
在问题表中,它有一个名为'question_number'的列。我不知道如何使用这个属性来获得我想要的结果。
答案 0 :(得分:3)
你的模特错了。玩这个:
class Test < ActiveRecord::Base
has_many :questions
end
class Question < ActiveRecord::Base
belongs_to :test
has_many :question_scores
has_many :students, :through => :question_scores
end
class Student < ActiveRecord::Base
has_many :question_scores
has_many :questions, :through => :question_scores
end
class QuestionScore < ActiveRecord::Base
belongs_to :student
belongs_to :question
end
代码应该是这样的:
<% @tests.each do |test| %>
<% test.questions.each do |question| %>
test: <% test.name %>
question: <%= question.name %>
max score: <%= question.question_scores.maximum(:score) %>
<% end %>
<% end %>
答案 1 :(得分:0)
如果正如你的评论所暗示的那样,你无法改变你的课堂结构,那么它将会有点难看。你仍然可以添加has_many :through
来清理一下:
class Test < ActiveRecord::Base
has_many :students
has_many :questions, :through => :students
end
class Student < ActiveRecord::Base
belongs_to :test
has_many :questions
end
class Question < ActiveRecord::Base
belongs_to :students
end
那么你将不得不嵌套迭代器...
<% @tests.each do |test| %>
<% 1.upto(5) do |index|
max = test.questions.select {|q|
q.question_number == index }.max_by {|q| q.score } %>
<tr>
<td><%= test.name %></td>
<td><%= index %></td>
<td><%= max.score %></td>
</tr>
<% end %>
<% end %>
您的代码存在的一个问题是,您每次测试只输出一次<tr>
。你想为每个问题做一次。更好的解决方案是编写范围。有点像:
class Test < ActiveRecord::Base
has_many :students
has_many :questions, :through => :students
end
class Student < ActiveRecord::Base
belongs_to :test
has_many :questions
end
class Question < ActiveRecord::Base
belongs_to :student
scope :max_score_by_question_number, lambda {|num| where(:question_number => num).maximum(:score) }
end
然后你可以这样做,看起来更好
<% @tests.each do |test| %>
<% 1.upto(5) do |index|
max = test.questions.max_score_by_question_number(index) %>
<tr>
<td><%= test.name %></td>
<td><%= index %></td>
<td><%= max.score %></td>
</tr>
<% end %>
<% end %>