class Video < ApplicationRecord include AASM alias_method :hard_destroy, :destroy default_scope -> { where(delete_state: nil) } scope :deleted, -> { unscope(where: :delete_state).where.not(delete_state: nil) } BEGIN_DELETE = 1 # 标记软删除 FINISH_DELETE = 2 # 视频资源完成删除 # 标准视频转码组 NORMAL_TRANSCODE_GROUP_ID = 'a0277c5c0c7458458e171b0cee6ebf5e' belongs_to :user has_many :video_applies, dependent: :destroy has_many :course_videos, dependent: :destroy has_one :processing_video_apply, -> { where(status: :pending) }, class_name: 'VideoApply' aasm(:status) do state :pending, initial: true state :processing state :refused state :published event :apply_publish do transitions from: :pending, to: :processing end event :refuse do transitions from: :processing, to: :refused end event :publish do transitions from: :processing, to: :published, guard: :vod_uploaded? end end aasm(:vod_status, namespace: :vod) do state :uploading, initial: true state :uploaded event :upload_success do transitions from: :uploading, to: :uploaded end end def video_play_duration (play_duration / (60*60.0)).ceil end def destroy run_callbacks(:destroy) do if persisted? update_column(:delete_state, Video::BEGIN_DELETE) AliyunVod::Service.delete_video([self.uuid]) end @destroyed = true end freeze end end