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.
educoder/app/models/hack.rb

88 lines
2.8 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 Hack < ApplicationRecord
# status: 0 未发布; 1已发布
# diffcult: 难度 1简单2中等 3困难
# 编程题
validates_length_of :name, maximum: 60, message: "不能超过60个字符"
validates_length_of :description, maximum: 5000, message: "不能超过5000个字符"
validates :description, presence: { message: "描述不能为空" }
validates :name, presence: { message: "名称不能为空" }
# 测试集
has_many :hack_sets, ->{order("position asc")}, :dependent => :destroy
# 代码
has_many :hack_codes, :dependent => :destroy
has_many :hack_user_lastest_codes, :dependent => :destroy
has_many :discusses, as: :dis, dependent: :destroy
# 点赞
has_many :praise_treads, as: :praise_tread_object, dependent: :destroy
# 消息
has_many :tidings, as: :container
# 知识点
has_many :tag_discipline_containers, as: :container, dependent: :destroy
belongs_to :user
belongs_to :sub_discipline
has_one :item_bank, as: :container, dependent: :destroy
scope :published, -> { where(status: 1) }
scope :unpublish, -> { where(status: 0) }
scope :opening, -> {where(open_or_not: 1)}
scope :mine, -> (author_id){ where(user_id: author_id) }
def language
if hack_codes.count == 1
hack_codes.first.language
else
hack_codes.pluck(:language).first
end
end
def code
if hack_codes.count == 1
#tran_base64_decode64(hack_codes.first.code)
hack_codes.first.code
else
#tran_base64_decode64(hack_codes.pluck(:code))
hack_codes.pluck(:code)
end
end
# 用于用户调试的第一个测试用例
def input_test_case
hack_sets.first&.input
end
# 管理员
def manager?(user)
user_id == user.id || user.admin_or_business?
end
# 复制fork
def fork
new_hack = Hack.new
new_hack.attributes = self.attributes.dup.except("id", "user_id", "status", "identifier", "comments_count", "praises_count",
"pass_num", "created_at", "updated_at", "hack_user_lastest_codes_count",
"open_or_not", "submit_num")
new_hack.user_id = User.current.id
new_hack.identifier = Util::UUID.generate_identifier(Hack, 8)
new_hack.fork_id = self.id
new_hack.save!
# 创建测试集与代码
hack_sets.each do |set|
new_hack.hack_sets.create!(input: set.input, output: set.output, position: set.position)
end
# 新建知识点
tag_discipline_containers.each do |tag|
new_hack.tag_discipline_containers.create!(tag_discipline_id: tag.tag_discipline_id)
end
hack_codes.each do |code|
new_hack.hack_codes.create!(code: code.code, language: code.language, modify_time: Time.now)
end
new_hack
end
end