class Competitions::SaveTeamForm include ActiveModel::Model attr_accessor :competition, :team, :creator attr_accessor :name, :teacher_ids, :member_ids validates :name, presence: true validate :check_creator_enrollable def check_creator_enrollable return unless check_creator_identity_enrollable check_creator_multiple_enrollable end validate :check_teachers_enrollable def check_teachers_enrollable if competition.teacher_enroll_forbidden? && teacher_ids.present? errors.add(:teacher_ids, :enroll_forbidden) return end self.teacher_ids = teacher_ids.map(&:to_i) all_teachers = creator.is_teacher? ? teacher_ids + [creator.id] : teacher_ids all_teachers.uniq! if all_teachers.size < competition.teacher_staff.minimum || all_teachers.size > competition.teacher_staff.maximum errors.add(:teacher_ids, :invalid_count, minimum: competition.teacher_staff.minimum, maximum: competition.teacher_staff.maximum) return end # 老师可多次报名,不检查 return unless competition.teacher_multiple_limited? # 存在已报名老师 enrolled_teacher_members = competition.team_members.where(user_id: all_teachers) .where.not(competition_team_id: team.id).includes(:user) if enrolled_teacher_members.present? errors.add(:teacher_ids, :enrolled, names: enrolled_teacher_members.map { |m| m.user.real_name }.join(',')) return end end validate :check_members_enrollable def check_members_enrollable if competition.member_enroll_forbidden? && member_ids.present? errors.add(:member_ids, :enroll_forbidden) return end self.member_ids = member_ids.map(&:to_i) all_members = creator.is_teacher? ? member_ids : member_ids + [creator.id] all_members.uniq! if all_members.size < competition.member_staff.minimum || all_members.size > competition.member_staff.maximum errors.add(:member_ids, :invalid_count, minimum: competition.member_staff.minimum, maximum: competition.member_staff.maximum) return end # 成员可多次报名,不检查 return unless competition.member_multiple_limited? # 存在已报名成员 enrolled_members = competition.team_members.where(user_id: all_members) .where.not(competition_team_id: team.id).includes(:user) if enrolled_members.present? errors.add(:member_ids, :enrolled, names: enrolled_members.map { |m| m.user.real_name }.join(',')) return end end private # 竞赛是否限制了职业 def check_creator_identity_enrollable if user.is_teacher? && competition.teacher_enroll_forbidden? errors.add(:creator, :teacher_enroll_forbidden) return false elsif !user.is_teacher? && competition.member_enroll_forbidden? errors.add(:creator, :member_enroll_forbidden) return false end true end # 创建者是否能多次报名 def check_creator_multiple_enrollable return unless competition.enrolled?(user) if (user.is_teacher? && competition.teacher_multiple_limited?) || (!user.is_teacher? && competition.member_multiple_limited?) errors.add(:creator, :enrolled) return false end true end end