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

131 lines
5.1 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 Poll < ApplicationRecord
belongs_to :course, counter_cache: true
belongs_to :user
belongs_to :exercise_bank, optional: true
# belongs_to :exercise_bank
has_many :poll_questions,dependent: :delete_all
has_many :poll_users, -> { where("is_delete != 1") }, :dependent => :delete_all
has_many :users, :through => :poll_users #该文件被哪些用户提交答案过
has_many :poll_group_settings, :dependent => :delete_all
has_many :course_acts, class_name: 'CourseActivity', as: :course_act, dependent: :delete_all
has_many :tidings, as: :container, dependent: :delete_all
scope :publish_or_not, -> { where("polls_status > ? ",1)}
scope :only_public, -> {where("is_public = ?",true)}
scope :public_or_unset, -> { where("unified_setting = ?",true) }
scope :poll_by_ids, lambda { |ids| where(id: ids) unless ids.blank? }
scope :poll_by_status, lambda { |s| where(polls_status: s) unless s.blank? }
scope :poll_group_ended, -> {where("end_time is NOT NULL AND end_time <= ?",Time.now)}
scope :poll_search, lambda { |keywords|
where("polls_name LIKE ?", "%#{keywords}%") unless keywords.blank?}
validates :polls_name, length: { maximum: 60, too_long: "60 characters is the maximum allowed" }
after_create :create_polls_list
def create_polls_list
str = ""
self.course.students.find_each do |student|
str += "," if str != ""
str += "(#{student.user_id},#{self.id}, 0, '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')"
end
if str != ""
sql = "insert into poll_users (user_id, poll_id, commit_status, created_at, updated_at) values" + str
ActiveRecord::Base.connection.execute sql
end
end
#获取学生视角的试卷用户
def get_poll_exercise_users
if unified_setting #试卷统一设置
poll_users
else
ex_group_setting_ids = poll_group_settings.poll_group_published.pluck(:course_group_id)
poll_users.where(user_id: course.students.where(course_group_id:ex_group_setting_ids).pluck(:user_id).uniq)
end
end
# 统一设置,为当前老师有权限的分班学生,分班设置,也为当前老师有权限的分班的学生
def all_poll_users(user_id)
poll_all_users = poll_users
group_ids = poll_published_ids(user_id)
if group_ids.present?
poll_all_users = poll_all_users.where(user_id: course.students.where(course_group_id: group_ids).select(:user_id).pluck(:user_id).uniq)
end
poll_all_users
end
#当前用户已发布的班级id和试卷分组已发布的班级id的交集
def poll_published_ids(user_id)
current_user_groups = course.teacher_course_ids(user_id)
if unified_setting
if course.none_group_count > 0 #有未分班的,则发布到未发布
un_group_ids = [0]
else
un_group_ids = []
end
(current_user_groups + un_group_ids).uniq #统一设置时为当前用户的分班id
else
ex_group_setting = poll_group_settings.select(:course_group_id).pluck("course_group_id").uniq
ex_group_setting & current_user_groups #当前用户有权限的已发布的分班id #非统一设置时为当前用户有权限的且已发布分班的id
end
end
def get_poll_status(user)
if user.student_of_course?(course)
ex_time = get_poll_times(user_id,false)
pb_time = ex_time[:publish_time]
ed_time = ex_time[:end_time]
if pb_time.present? && ed_time.present? && pb_time <= Time.now && ed_time > Time.now
status = 2
elsif ed_time.present? && ed_time <= Time.now
status = 3
else
status = 1
end
else
status = polls_status
end
status
end
#获取问卷的发布时间和截止时间。teacher 为boolean,当为true时表示的是当前为老师
def get_poll_times(user_id,teacher)
if unified_setting || teacher
pb_time = publish_time
en_time = end_time
else
poll_group_setting = poll_group_settings
user_group = course.course_members.where(user_id: user_id).select(:course_group_id)
if user_group.exists?
user_group_id = user_group.first&.course_group_id
user_p_group_setting = poll_group_setting.where(course_group_id: user_group_id).select(:publish_time,:end_time)
pb_time = user_p_group_setting.first&.publish_time
en_time = user_p_group_setting.first&.end_time
else
pb_time = nil
en_time = nil
end
end
{
"publish_time":pb_time,
"end_time":en_time
}
end
#判断当前用户的答题状态
def check_user_votes_status(user)
poll_answer_user = poll_users.where(user_id: user.id).select(:start_at,:end_at,:commit_status)
user_status = 2
if poll_answer_user.exists? && (poll_answer_user.first&.start_at.present? || poll_answer_user.first&.end_at.present?) #学生有过答题的,或者立即截止,但学生未做试卷的
user_status = poll_answer_user.first.commit_status
end
user_status
end
end