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/myshixun.rb

155 lines
4.6 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.

# encoding: utf-8
# status 1:完成实训
# modified_time为实训TPM有改动非版本库reset_time为版本库修改时间
class Myshixun < ActiveRecord::Base
attr_accessible :description, :name, :parent_id, :user_id, :gpid, :forked_from, :visits, :is_public, :identifier, :shixun_id,
:modify_time, :reset_time, :updated_at, :created_at, :status, :git_url, :onclick_time, :commit_id
# has_many :users, :through => :myshixun_members
has_many :myshixun_members, :dependent => :destroy
has_one :repository, :dependent => :destroy
has_many :games, :dependent => :destroy, :order => "games.id ASC"
belongs_to :shixun, counter_cache: :myshixuns_count
has_one :shixun_modify, :dependent => :destroy
has_one :webssh, :dependent => :destroy
has_many :student_works
belongs_to :user
validates_uniqueness_of :shixun_id, :scope => :user_id, :message => "error"
# validates :shixun_id, :uniqueness => {:scope => :user_id, :message => "不能被重复开启"}
scope :min, lambda { select([:id, :shixun_id, :identifier, :gpid, :status, :user_id, :commit_id, :modify_time, :reset_time, :system_tip]) }
scope :finished, lambda{where(status: 1)}
def output_times
times = Output.where(:game_id => self.games.map(&:id), :test_set_position => 1).count
times
end
def mirror_name
self.shixun.mirror_repositories.map(&:type_name).blank? ? "" : self.shixun.mirror_repositories.map(&:type_name)
end
def main_mirror
self.shixun.mirror_repositories.published_main_mirror.try(:first)
end
def total_stage
self.games.count
end
def current_stage
game = self.games.where(:status => 0).first
position = game.blank? ? games.count : game.challenge.try(:position)
return position
end
def current_stages
game = self.games.where(:status => 1).first
position = game.blank? ? 1 : game.challenge.try(:position)
return position
end
# 通关时间
def done_time
time = ""
if self.status == 1 || self.games.where(:status => 2).count == self.shixun.challenges.count
time = self.games.map(&:end_time).max
end
time
end
def is_complete?
self.status == 1 || self.games.where(:status => 2).count == self.games.count
end
def total_spend_time
time = 0
self.games.each do |game|
if game.status == 2
time += (game.end_time.to_i - game.open_time.to_i) > 0 ? (game.end_time.to_i - game.open_time.to_i) : 0
end
end
time
end
# 准确率
def total_accuracy
accuracy = 0
count = 0
self.games.where(:status => 2).each do |game|
count += 1
accuracy += game.accuracy ? game.accuracy : 0
end
accuracy.to_f / count
end
# 通过的关卡理应得到的总经验值(看与不看参考答案无影响)
def sum_score
score = 0
self.games.each do |game|
if game.status == 2
total_exp = game.challenge.score.to_i
score += total_exp
end
end
score
end
# 获得的经验值
def total_score
score = 0
self.games.where(:status => 2).each do |game|
score += game.final_score.to_i < 0 ? 0 : game.challenge.score.to_i
end
score
end
def total_gold
score = 0
self.games.each do |game|
if game.status == 2
total_gold =game.answer_open? ? -game.challenge.score.to_i : game.final_score.to_i
score += total_gold
end
end
score
end
# id 转换成 identifier
def to_param
identifier
end
# 当前任务:一个实训中只可能一个未完成任务(status 0或1只会存在一条记录)
# status:0 可以测评的,正在测评的
# 如果都完成,则当前任务为最后一个任务
def current_task
games = self.games
current_game = games.select{|game| game.status == 1 || game.status == 0}.first
if current_game.blank?
current_game = Game.find_by_sql("SELECT g.* FROM games g, challenges c where g.myshixun_id=#{self.id} and g.challenge_id = c.id and g.status = 2 order by c.position desc").first
end
return current_game
#
# if self.status == 1
# current_game = Game.find_by_sql("SELECT g.* FROM games g, challenges c where g.myshixun_id=#{self.id} and g.challenge_id = c.id and g.status = 2 order by c.position desc").first
# else
# current_game = self.games.select{|game| game.status == 1 || game.status == 0}.first
# end
# return current_game
end
def owner
self.user
rescue ActiveRecord::RecordNotFound
end
def score
game = self.games.where(:status => [0, 1]).first
unless game.blank?
score = game.challenge.try(:score)
end
return score
end
end