1

我正在我的网络上制作一个测试应用程序,用户可以在其中看到一个检查列表,标记所有适用的内容并根据他选择的内容获得结果。

每个问题都有一个类别和一个值,并且 id 喜欢获取得分最高的类别(将每个类别的所有值相加并返回最高的)

我已经取得了一些成功,通过下面的代码,我将所有回答的问题分数加在一起,而不考虑每个问题属于哪个类别

      @test_session.answered_questions.each do |a|
        if a.answer == 1
          @theResult.score = @theResult.score + a.q_value
        end    
        @theResult.save!
      end

问题是复选框,所以如果answer == 1复选框被标记

问题是类别的数量是动态的..

我有一个想法,我可以循环@test_session.answered_questions.category.each将类别值添加到一些变量中,并在计算所有类别分数时进行比较,但是我将有动态数量的变量进行比较

我觉得我应该为此使用一些地图功能

更新

这是我设置问题类别属性的方法

<%= nested_form_for @personal_test do |f| %>

  <div class="field">
    <%= f.label "Name" %>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label "Description" %>
    <%= f.text_area :description %>
  </div>

  <div class="field">
<%= f.fields_for :questions do |ff| %>
  <%= ff.label "Question" %>
  <%= ff.text_field :question_text %>

  <%= ff.label "Question value" %>
  <%= ff.number_field :value %>

  <%= ff.select :category, options_for_select(Category.all.collect {|p| [ p.name, p.id ] }, :selected => ff.object.category), :prompt => 'Category' %>
  <% end %>
<% end %>
4

1 回答 1

1

我想你会想做这样的事情。我在代码中添加注释以尝试解释它。

#loop through all categories...
@test_session.answered_questions.category.each do |c|
   sum = 0
   #loop through every questions in current category
   c.answered_questions.each do |a|
      if a.answer == 1
         sum += a.q_value
      end
   end
   #keep track of the highest score and category as we go along...
   #we can forget about the rest
   if @theResult.score.nil? or sum > @theResult.score
      @theResult.score = sum
      @theResult.category = c
   end 
end

#theResult now holds the category with the highest score

@theResult.save!
于 2012-12-07T15:30:33.960 回答