#coding=utf-8 # st 0:实践任务;1:选择题任务 # show_type: [1, "图片"], [2, "apk/exe"], [3, "txt"], [4, "html"] # modify_time: 与games表的modify_time联合使用,2个字段一致,则表示测试集未修改,反之,被修改 class Challenge < ActiveRecord::Base default_scope :order => 'position' belongs_to :shixun, :touch=> true, counter_cache: true belongs_to :user has_many :challenge_samples, :dependent => :destroy has_many :test_sets, :dependent => :destroy has_many :challenge_tags, :dependent => :destroy has_many :games, :dependent => :destroy has_many :challenge_chooses, :dependent => :destroy has_many :homework_challenge_settings has_many :praise_tread, as: :praise_tread_object, dependent: :destroy has_one :praise_tread_cache, as: :object, dependent: :destroy has_many :tidings acts_as_attachable validates_presence_of :subject # validates_presence_of :score validates_presence_of :task_pass validates_length_of :subject, :maximum => 255 scope :min, lambda { select([:id, :subject, :position, :shixun_id, :st, :score, :exec_time, :path, :task_pass, :modify_time, :web_route, :answer]) } scope :choose_type, lambda{where(st: 1)} scope :practice_type, lambda{where(st: 0)} def shixun_done_new self.games.select{|game| game.status == 2 }.size end def shixun_running_new self.games.select{|game| game.status != 2 }.size end def game_difficulty str = "简单" case self.difficulty when 1 str = "简单" when 2 str = "中等" when 3 str = "困难" end str end ## 用户关卡状态 0: 不能开启实训; 1:直接开启; 2表示已完成 def user_tpi_status(user_id) # todo: 以前没加索引导致相同关卡,同一用户有多个games game = self.games.where(user_id: user_id).last status = if game.blank? self.position == 1 ? 1 : 0 elsif game.status == 2 2 else 1 end end def challenge_file_show_type [[1, "图片"], [2, "apk/exe"], [3, "txt"], [4, "html"]] end alias :cfst :challenge_file_show_type def choose_correct_num num = 0 self.challenge_chooses.each do |choose| outputs = ChooseOutputs.where(:challenge_choose_id => choose.id, :user_id => User.current.id).first if outputs.nil? num = nil else num += (outputs.correct ? 1 : 0) end end return num end def choose_score score = 0 if self.st == 1 self.challenge_chooses.each do |choose| score += choose.score.to_i end else return self.score end return score end def choose_tags_num num = 0 self.challenge_chooses.includes(:challenge_tags).each do |choose| num += choose.challenge_tags.count end return num end def tags_show if self.challenge_tags.nil? "--" else self.try(:challenge_tags).map(&:name).join(";") end end def next_challenge challenge_count = Challenge.where(:shixun_id => self.shixun_id).count if self.position != challenge_count Challenge.where(:position => (self.position + 1), :shixun_id => self.shixun).first end end def prev_challenge render_404 if self.position == 1 Challenge.where(:position => (self.position - 1), :shixun_id => self.shixun).first end def last_challenge render_404 if self.position < 2 position = self.position - 1 Challenge.where(:position => position, :shixun_id => self.shixun).first end def current_user_game myshixun = Myshixun.where(:shixun_id => self.shixun.id, :user_id => User.current.id).first game = Game.where(:myshixun_id => myshixun, :challenge_id => self.id).first end # # 当前用户开启的实训中应进入的game关卡 # # 为了节约性能而写的 # def game # self.games.where(:user_id => ) # end def user_myshixun Myshixun.where(:shixun_id => self.shixun.id, :user_id => User.current.id).first end # 正确答案 def right_answers answer = "" self.challenge_questions.each do |ans| if ans.right_key answer << (ans.position + 65).chr end end return answer end # 通关的games def passed_games self.games.where(:status => 2) end end