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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
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 ? score : (self.final_score.to_f / challenge.score) * score
end
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