работа с хеш-ключами и значениями - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть модель QuizAttempt, которая собирается проверить результат теста.Я пытаюсь просмотреть каждый представленный ответ и проверить идентификатор вопроса, если ответ правильный.Я ищу руководство, пожалуйста ...

class QuizAttempt < ActiveRecord::Base
  belongs_to :user
  belongs_to :quiz

  validates_presence_of :quiz, :user
  validate :check_result

  attr_accessor :questions, :submitted_answers

  private

  def self.create_for_user_and_answers!(user, answers)
    self.new(:user => user).tap do |q| 
      q.submitted_answers = answers
      q.questions = []
      answers.each{|k, v| q.questions = q.questions << Question.find(k.gsub(/[^0-9]/i, '').to_i) }
    end
  end

  def check_result
    if submitted_answers
      unless submitted_answers.keys.length == quiz.easy_questions + quiz.moderate_questions + quiz.hard_questions
        self.errors.add(:submitted_answers, "must be provided for each question")
      end
    else
      self.errors.add(:submitted_answers, "must be provided")
    end

    return false unless self.errors.empty?

    score = 0
    submitted_answers.each do |answer|
      #check the answers and score + 1 if correct
    end
    self.total_questions = submitted_answers.length
    self.passed_questions = score
    self.passed = percentage_score >= quiz.pass_percentage
  end

  public

  def percentage_score
    (passed_questions / total_questions.to_f * 100).to_i
  end

end

Представленные ответы представлены в виде (вложенного?) Хеша, возвращенного из формы с переключателями

{"question_1"=>{"answer_3"=>"5"}, "question_2"=>{"answer_2"=>"4"}}

Но когда я перебираю их как в приведенной выше модели QuizAttempt, т.е.submit_answers.each do | answer |я получаю ответ ==

["question_1", {"answer_3"=>"5"}]

И я хочу проверить эти ответы на основе модели вопроса ниже

class Question < ActiveRecord::Base
  belongs_to :quiz

  validates :question, :presence => true, :length => {:minimum => 3, :maximum => 254}
  validates :answer_1, :answer_2, :answer_3, :answer_4, :presence => true, :length => {:maximum => 254}
  validates :rank, :presence => true, :numericality => { :only_integer => true, :greater_than => 0, :less_than => 4 }
  validate :only_one_answer_correct  

  #has boolean values answer_1_correct, answer_2_correct, answer_3_correct, answer_4_correct

  def correct_answer_number
    (1..4).each{|i| return i if send("answer_#{i}_correct")}
  end
end

1 Ответ

1 голос
/ 29 февраля 2012

Было бы намного проще, если бы вы изменили способ структурирования формы.

answer[1].keys.first.sub("answer_", '').to_i

даст вам 3 для вашего примера ["question_1", {"answer_3" => "5"}], который затем можно сравнить с correct_answer_number в модели вопроса.

Я не уверен, каково значение, связанное с "answer_x"? Я предположил, что это не был ответ (как в 1,2,3 или 4), поскольку это 5, и у вас есть только 4 возможных ответа, поэтому я предположил, что 5 был фактическим ответом на вопрос, и проигнорировал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...