1

私は自分のWebでテストアプリを作成しています。このアプリでは、ユーザーがチェックリストを表示し、該当するものすべてにマークを付けて、選択した内容に基づいて結果を取得できます。

すべての質問にはカテゴリと値があり、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 に答える