You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/models/game.rb

154 lines
5.2 KiB

6 years ago
class Game < ActiveRecord::Base
# stauts 0: can exe 1doing 2successed 3:locked
# modify_time 与challenges表的modify_time联合使用2个字段一致则表示测试集未修改反之被修改
default_scope :order => 'games.created_at desc'
attr_accessible :myshixun_id, :user_id, :status, :final_score, :challenge_id, :open_time, :identifier, :answer_open, :end_time,
:retry_status, :resubmit_identifier, :test_sets_view, :picture_name, :accuracy, :modify_time, :cost_time, :evaluate_count
belongs_to :myshixun,:touch=> true
belongs_to :user
belongs_to :challenge
has_many :outputs, :dependent => :destroy
has_many :choose_output
# has_many :test_sets, :dependent => :destroy
has_many :challenge_samples
has_many :game_codes, :dependent => :destroy
has_many :evaluate_records, :dependent => :destroy
has_one :run_code_message, :dependent => :destroy
6 years ago
include ApplicationHelper
scope :min, lambda { select([:id, :status, :myshixun_id, :user_id, :final_score, :challenge_id, :identifier,
:answer_open, :test_sets_view, :cost_time, :star, :modify_time]) }
# 根据得分比例来算实际得分(试卷、实训作业)
def real_score score
self.final_score == challenge.score ? self.final_score : (self.final_score.to_f / challenge.score) * score
end
6 years ago
def had_done
myshixun = self.myshixun
challenge_count = myshixun.games.count
had_done = (myshixun.games.where(:status => 2).count == challenge_count) ? 1 : 0
return had_done
end
def had_passed?
self.status == 2 ? true : false
end
def consumes_time
if self.end_time.blank?
"--"
else
game_spend_time(self.cost_time)
end
end
def consumes_time_int
if self.end_time.blank?
0
else
self.end_time.to_i - self.open_time.to_i
end
end
# id 转换成 challenge'position
def to_param
identifier
end
# 因为outputs是按qurey_index倒序所有first取的qurey_index的最大值
# 之所以加1是以为存的时候要递增如果仅取的话则注意必须减一
def query_index
if self.outputs.try(:first).present?
self.outputs.first.try(:query_index).to_i + 1
else
1
end
end
def lastest_code
self.game_codes.first.try(:new_code)
# game_code = GameCode.where(:game_id => self.id).first
# game_code.try(:new_code)
end
def last_game
challenge = self.challenge
last_challenge_id = challenge.last_challenge
game = Game.where(:myshixun_id => self.myshixun_id, :challenge_id => last_challenge_id).first
#render_404 if game.nil?
return game
end
# def next_game
# challenge = self.challenge
# next_challenge_id = challenge.next_challenge
# game = Game.where(:myshixun_id => self.myshixun_id, :challenge_id => next_challenge_id).first
# raise ActiveRecord::RecordNotFound if game.nil?
# return game
# end
def prev_game
challenge = self.challenge
prev_challenge_id = challenge.prev_challenge
game = Game.where(:myshixun_id => self.myshixun_id, :challenge_id => prev_challenge_id).first
raise ActiveRecord::RecordNotFound if game.nil?
return game
end
# 针对api形式取下一关identifier
def self.next_game shixun_id, myshixun_id, challenge_position
next_game = Game.find_by_sql("select * from games where myshixun_id=#{myshixun_id} and challenge_id=(select id from challenges where
shixun_id=#{shixun_id} and position=#{challenge_position + 1})").first
end
# 针对api形式取上一关identifier
def self.prev_identifier shixun_id, myshixun_id, challenge_position
Game.find_by_sql("select identifier from games where myshixun_id=#{myshixun_id} and challenge_id=(select id from challenges where
shixun_id=#{shixun_id} and position=#{challenge_position - 1})").first.try(:identifier)
end
def up_game
challenge = self.challenge
if challenge.position == 1
self
else
prev_challenge_id = Challenge.where(:position => (challenge.position - 1), :shixun_id => challenge.shixun).first
game = Game.where(:myshixun_id => self.myshixun_id, :challenge_id => prev_challenge_id).first
end
end
def down_game
challenge = self.challenge
challenge_count = Challenge.where(:shixun_id => challenge.shixun_id).count
if challenge.position == challenge_count
challenge.position = 0
end
next_challenge_id = Challenge.where(:position => (challenge.position + 1), :shixun_id => challenge.shixun).first
game = Game.where(:myshixun_id => self.myshixun_id, :challenge_id => next_challenge_id).first
end
def all_outputs
Output.select([:game_id, :query_index, :out_put, :created_at]).where(:game_id => self.id).group(:query_index)
end
# 获取game最新的一条输出结果
def latest_output
outputs = Output.where(:game_id => self.id).order("created_at desc")
output = outputs.blank? ? nil : outputs.first
return output
end
def is_final_game?
challenge = self.challenge
challenge.try(:position).to_i == challenge.shixun.challenges.count ? true : false
end
# 选择题正确答案个数
def choose_correct_num
Output.where(:game_id => self.id, :query_index => (self.query_index - 1), :result => 1).count
end
end