# encoding: utf-8 module ExerciseHelper def shixun_question_level level case level when 1 "初级题" when 2 "中级题" when 3 "高级题" when 4 "顶级题" end end def exercise_shixun_json_data shixuns shixuns.map do |shixun| shixun_owner = shixun.owner.try(:show_name) shixun_path = shixun_path(shixun) shixun_level = shixun.shixun_level owner_path = user_path(shixun.owner) shixun.attributes.dup.except("gpid", "identifier", "major_id", "webssh", "homepage_show", "fork_from", "git_url", "mirror_script_id", "repo_name", "pod_life").merge({ shixun_owner: shixun_owner, shixun_level: shixun_level, shixun_path: shixun_path, owner_path: owner_path }) end end def un_commit_num exercise course = exercise.course member = course.members.where(:user_id => User.current.id).first exercise_users = exercise.exercise_users student_count = course.student.count if member.present? && member.teacher_course_groups.count > 0 group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id) student_count = group_students.size exercise_users = exercise_users.where(:user_id => group_students) end student_count - exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id)).count end def has_commit_num exercise course = exercise.course member = course.members.where(:user_id => User.current.id).first exercise_users = exercise.exercise_users if member.present? && member.teacher_course_groups.count > 0 group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id) exercise_users = exercise_users.where(:user_id => group_students) end exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id)).count end def un_comment_num exercise course = exercise.course member = course.members.where(:user_id => User.current.id).first exercise_users = exercise.exercise_users if member.present? && member.teacher_course_groups.count > 0 group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id) exercise_users = exercise_users.where(:user_id => group_students) end exercise_users.where(:commit_status => 1, :subjective_score => -1).count end def has_comment_num exercise course = exercise.course member = course.members.where(:user_id => User.current.id).first exercise_users = exercise.exercise_users if member.present? && member.teacher_course_groups.count > 0 group_students = course.members.where(:course_group_id => member.teacher_course_groups.pluck(:course_group_id)).map(&:user_id) exercise_users = exercise_users.where(:user_id => group_students) end exercise_users.where("commit_status = 1 and subjective_score != -1").count end def answer_is_correct eq, user is_correct = false case eq.question_type when 1 answer = get_user_answer(eq, user) standard_answer = get_user_standard_answer(eq, user) is_correct = !answer.empty? && !standard_answer.empty? && answer.first.exercise_choice.choice_position == standard_answer.first.exercise_choice_id when 2 standard_answer = get_user_standard_answer(eq, user) is_correct = !standard_answer.empty? && get_mulscore(eq, user).to_i == standard_answer.first.exercise_choice_id when 3 answer = get_user_answer(eq, user) standard_answer = get_user_standard_answer(eq, user) is_correct = !answer.empty? && !standard_answer.empty? && standard_answer.collect{|answer| answer.strip}.include?(answer.first.answer_text.strip.downcase) when 5 is_correct = eq.exercise_shixun_answers.where(:status => 1, :user_id => user.id).count == eq.shixun.challenges.count end is_correct end def question_correct_rate eq, user_ids count = 0 rate = 0 user_ids_str = user_ids.length == 0 ? "(-1)" : "("+user_ids.join(",")+")" user_ids.each do |user_id| user = User.where(:id => user_id).first case eq.question_type when 1, 2, 3 if user && answer_is_correct(eq, user) count += 1 end rate = user_ids.length == 0 ? 0 : count.to_f / user_ids.length when 4 rate = user_ids.length * eq.question_score > 0 ? eq.exercise_answers.where("user_id in #{user_ids_str} and score <> -1").collect(&:score).sum.to_f / (user_ids.length * eq.question_score) : 0 when 5 rate = user_ids.length * eq.question_score > 0 ? eq.exercise_shixun_answers.where("user_id in #{user_ids_str}").collect(&:score).sum.to_f / (user_ids.length * eq.question_score) : 0 end end rate = format("%.1f", rate*100) end #多选的时候查询去重 def total_answer id, user_ids user_ids = user_ids.blank? ? "(-1)" : "(" + user_ids.join(",") + ")" total = ExerciseAnswer.find_by_sql("SELECT distinct(user_id) FROM `exercise_answers` where exercise_question_id = #{id} and user_id in #{user_ids}").count end def shixun_question_score eq, user score = 0 if eq.question_type == 5 eq.exercise_shixun_answers.where(:user_id => user.id).each do |answer| score += answer.score end end score end # 单选 def sigle_selection_standard_answer(params) size = params.ord - 96 if size > 0 # 小写字母答案 answer = params.ord - 96 else answer = params.ord - 64 end end # 多选 def multiselect_standard_answer(params) size = params.ord - 96 answer = [] if size > 0 # 小写字母答案 for i in 0..(params.length-1) answer << (params[i].ord - 96).to_s end else for i in 0..(params.length-1) answer << (params[i].ord - 64) end end answer = answer.sort answer.join("") end # def fill_standart_answer(params, standart_answer) params.each do |param| standart_answer.answer_text = param.value standart_answer.save end end # 获取多选的得分 def get_mulscore(question, user) ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id) arr = [] ecs.each do |ec| arr << ec.exercise_choice.choice_position end #arr = arr.sort str = arr.sort.join("") return str end # 判断用户是否已经提交了问卷 # status 为0的时候是用户点击试卷。为1表示用户已经提交 def has_commit_exercise?(exercise_id, user_id) pu = ExerciseUser.where("exercise_id=? and user_id=? and status=?",exercise_id, user_id, true) if pu.empty? false else true end end def can_edit_exercise exercise, exercise_user exercise_end = exercise.end_time.nil? ? false : exercise.end_time > Time.now if exercise.time == -1 can_edit_excercise = exercise_end && exercise_user.commit_status == 0 else left_time = (Time.now.to_i - exercise_user.start_at.to_i) < exercise.time.to_i * 60 can_edit_excercise = !exercise_user.status && left_time && exercise_end end can_edit_excercise end # 判断学生是否点击过问卷,点击则为他保存一个记录,记录start_at def has_click_exercise?(exercise_id, user_id) pu = ExerciseUser.where("exercise_id=? and user_id=? and status=?",exercise_id, user_id, false) if pu.empty? false else true end end def convert_to_char(str) result = "" length = str.length unless str.nil? if length === 1 result += (str.to_i + 64).chr return result elsif length > 1 for i in 0...length result += (str[i].to_i + 64).chr end return result end end return result end def convert_to_chi_num num result = "" case num.to_i when 1 result = '一' when 2 result = '二' when 3 result = '三' when 4 result = '四' when 5 result = '五' when 6 result = '六' when 7 result = '七' when 8 result = '八' when 9 result = '九' end return result end def get_current_score exercise total_score = 0 mc_score = 0 mcq_score = 0 single_score = 0 multi_score = 0 shixun_score = 0 unless exercise.nil? exercise.exercise_questions.each do |exercise_question| unless exercise_question.question_score.nil? total_score += exercise_question.question_score case exercise_question.question_type when 1 mc_score += exercise_question.question_score when 2 mcq_score += exercise_question.question_score when 3 single_score += exercise_question.question_score when 4 multi_score += exercise_question.question_score when 5 shixun_score += exercise_question.question_score end end end return total_score, mc_score, mcq_score, single_score, multi_score, shixun_score end return total_score, mc_score, mcq_score, single_score, multi_score, shixun_score end def answer_be_selected?(answer,user) # pv = answer.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id} ") pv = answer.exercise_answers.select{|e| e.user_id == user.id} if !pv.nil? && pv.size > 0 true else false end end #获取未完成的题目 def get_uncomplete_question exercise, exercise_user # all_questions = exercise.exercise_questions.includes(:exercise_answers).where("question_type != 5") uncomplete_question = [] questions = exercise.user_question_list(exercise_user.id) questions.includes(:exercise_answers).where("question_type != 5").each do |question| # answers = get_user_answer(question, user) answers = question.exercise_answers.select{|e| e.user_id == exercise_user.user_id} if answers.empty? uncomplete_question << question end end uncomplete_question end # 获取未通关的实训 def get_uncomplete_shixun exercise, exercise_user questions = exercise.user_question_list(exercise_user.try(:id)) all_questions = questions.where("question_type = 5") uncomplete_shixun = [] all_questions.each do |question| myshixun = Myshixun.where(:shixun_id => question.shixun_id, :user_id => exercise_user.user_id).first unless myshixun && myshixun.is_complete? uncomplete_shixun << question end end uncomplete_shixun end # 题目已答或未答 def question_answer_or_not question, user if question.question_type == 5 # is_answer = question.exercise_shixun_answers.where(:user_id => user.id, :status => 1).count > 0 is_answer = question.exercise_shixun_answers.select{|e| e.user_id == user.id && e.status == 1}.count > 0 else # is_answer = user.exercise_answer.where(:exercise_question_id => question.id).count > 0 is_answer = question.exercise_answers.select{|e| e.user_id == user.id}.count > 0 end is_answer end def question_commit_status question, user status = "" case question.question_type when 3, 4 get_anwser_vote_text(question.id,user.id) == "" ? status = "未答" : status = "" when 1, 2 get_user_answer(question,user).empty? ? status = "未答" : status = "" when 5 question.exercise_shixun_answers.where(:user_id => user.id).empty? ? status = "未答" : status = "" end status end # 获取文本题答案 def get_anwser_vote_text(question_id,user_id) pv = ExerciseAnswer.find_by_exercise_question_id_and_user_id(question_id,user_id) if pv.nil? '' else pv.answer_text end end def new_get_anwser_vote_text question, user pv = question.exercise_answers.select{|exercise_answer| exercise_answer.user_id == user.id} if pv.blank? '' else pv.first.try(:answer_text) end end # 获取当前学生回答问题的答案 def get_user_answer(question,user) user_answer = question.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id}") # user_answer = question.exercise_answers.select{|e| e.user_id == user.id} user_answer end # 获取问题的标准答案 def get_user_standard_answer(question,user) if question.question_type == 3 standard_answer =[] question.exercise_standard_answers.each do |answer| standard_answer << answer.answer_text.downcase end else standard_answer = question.exercise_standard_answers end standard_answer end # 问题随机的下拉列表 def question_random_select type = [] option1 = [] option1 << "题目不随机打乱" option1 << 0 type << option1 option2 = [] option2 << "题目随机打乱" option2 << 1 type << option2 end # 选项随机的下拉列表 def choice_random_select type = [] option1 = [] option1 << "选项不随机打乱" option1 << 0 type << option1 option2 = [] option2 << "选项随机打乱" option2 << 1 type << option2 end #允许学生查看结果的下拉列表 def show_result_select type = [] option1 = [] option1 << "允许学生查看测验结果" option1 << 1 type << option1 option2 = [] option2 << "不允许学生查看测验结果" option2 << 0 type << option2 end end