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