89 lines
3.7 KiB
Ruby
89 lines
3.7 KiB
Ruby
class Poll < ActiveRecord::Base
|
||
#attr_accessible :closed_at, :polls_group_id, :polls_name, :polls_status, :polls_type, :published_at, :user_id
|
||
include Redmine::SafeAttributes
|
||
include ApplicationHelper
|
||
|
||
belongs_to :user
|
||
has_many :poll_questions, :dependent => :destroy,:order => "#{PollQuestion.table_name}.question_number"
|
||
has_many :poll_users, :dependent => :destroy
|
||
has_many :users, :through => :poll_users #该文件被哪些用户提交答案过
|
||
# 添加课程的poll动态
|
||
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
|
||
# 课程动态
|
||
has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
|
||
after_create :act_as_activity, :act_as_course_activity
|
||
# 课程消息
|
||
has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
|
||
after_save :act_as_course_message, :act_as_activity, :act_as_course_activity
|
||
after_update :update_activity
|
||
acts_as_event :title => Proc.new {|o| "#{l(:label_course_poll)}: #{o.polls_name}" },
|
||
:description => :polls_description,
|
||
:datetime => :published_at,
|
||
:author => :user,
|
||
:url => Proc.new {|o| {:controller => 'poll', :action => 'show', :id => o.id}}
|
||
|
||
acts_as_activity_provider :type => 'polls',
|
||
#:permission => :view_course_polls,
|
||
:find_options => {:select => "#{Poll.table_name}.*",
|
||
:joins => "LEFT JOIN #{Course.table_name} ON ( #{Poll.table_name}.polls_type='Course' AND #{Poll.table_name}.polls_status= 2 AND #{Poll.table_name}.polls_group_id = #{Course.table_name}.id )"},
|
||
:timestamp => "#{self.table_name}.published_at",
|
||
:author_key => :user_id
|
||
|
||
def act_as_activity
|
||
self.acts << Activity.new(:user_id => self.user_id)
|
||
end
|
||
|
||
#动态的更新
|
||
def update_activity
|
||
update_course_activity(self.class, self.id)
|
||
update_user_activity(self.class, self.id)
|
||
update_org_activity(self.class, self.id)
|
||
end
|
||
|
||
#课程动态公共表记录
|
||
def act_as_course_activity
|
||
if self.polls_type == "Course"
|
||
if self.polls_status == 2 #问卷是发布状态
|
||
if CourseActivity.where(:course_id => self.polls_group_id, :user_id => self.user_id, :course_act_id => self.id, :course_act_type => 'Poll').count == 0
|
||
self.course_acts << CourseActivity.new(:user_id => self.user_id,:course_id => self.polls_group_id)
|
||
end
|
||
elsif self.polls_status == 1 #问卷是新建状态
|
||
self.course_acts.destroy_all
|
||
end
|
||
end
|
||
end
|
||
|
||
# 发布问卷,出了发布者外,其他人都能收到消息通知
|
||
def act_as_course_message
|
||
if self.polls_type == "Course"
|
||
if self.polls_status == 2 #问卷是发布状态
|
||
vs = []
|
||
Course.find(self.polls_group_id).members.each do |m|
|
||
if m.user_id != self.user_id
|
||
vs << {course_message_type:'Poll',course_message_id:self.id, :user_id => m.user_id,
|
||
:course_id => self.polls_group_id, :viewed => false}
|
||
|
||
#delayed_job卡住的原因是一次执行的条数太多,导致超时。
|
||
#现在把每次只执行不超过30条,就不会超了。
|
||
if vs.size >= 30
|
||
self.delay.contain_poll_message(vs)
|
||
vs.clear
|
||
end
|
||
end
|
||
end
|
||
|
||
unless vs.empty?
|
||
self.delay.contain_poll_message(vs)
|
||
end
|
||
|
||
elsif self.polls_status == 1 #问卷是新建状态
|
||
self.course_messages.destroy_all
|
||
end
|
||
end
|
||
end
|
||
|
||
def contain_poll_message(vs)
|
||
CourseMessage.create(vs)
|
||
end
|
||
end
|