|
- class Discuss < ApplicationRecord
- default_scope { order(created_at: :desc) }
-
- belongs_to :user
- belongs_to :parent, class_name: 'Discuss', foreign_key: :parent_id, optional: true
-
- has_many :children, -> { reorder(created_at: :asc) }, class_name: 'Discuss', foreign_key: :parent_id
- has_many :praise_treads, as: :praise_tread_object, dependent: :destroy
- has_many :tidings, as: :container, dependent: :destroy
- has_one :praise_tread_cache, as: :object, dependent: :destroy
- belongs_to :dis, polymorphic: true
-
- belongs_to :challenge, optional: true
- validate :validate_sensitive_string
-
- validates :content, length: { maximum: 2000, too_long: "不能超过2000个字符" }
-
- after_create :send_tiding
-
- scope :children, -> (discuss_id){ where(parent_id: discuss_id).includes(:user).reorder(created_at: :asc) }
-
- def has_parent?
- parent_id.present?
- end
-
- def username
- user.full_name
- end
-
- def can_deleted?(user)
- user.admin? || user.id == user_id
- end
-
- def game_url(shixun, user)
- return '' unless shixun.has_manager?(user)
-
- game = Game.joins(:challenge).where(challenges: { shixun_id: shixun.id, position: position || 1 })
- .select(:identifier).find_by(user_id: user_id)
- "/tasks/#{game&.identifier}"
- end
-
- # def contents(shixun, user)
- # return content unless hidden?
- #
- # shixun.has_manager?(user) ? content : ''
- # end
-
- def child_discuss(user)
- Discuss.where(parent_id: self.id).includes(:user).reorder(created_at: :asc)
- end
-
- def child_discuss_count
- Discuss.where(root_id: id).count
- end
-
- private
-
- def send_tiding
- if dis_type == 'Shixun'
- send_user_id = has_parent? ? parent.user_id : Challenge.find(challenge_id).user_id
- parent_container_type = 'Challenge'
- challenge_id = challenge_id
- extra = ''
- elsif dis_type == 'Hack'
- send_user_id = has_parent? ? parent.user_id : Hack.find(dis_id).user_id
- parent_container_type = 'Hack'
- challenge_id = dis_id
- extra = HackUserLastestCode.where(user_id: user_id, hack_id: dis_id).first&.identifier
- end
- base_attrs = {
- trigger_user_id: user_id, parent_container_id: challenge_id, parent_container_type: parent_container_type,
- belong_container_id: dis_id, belong_container_type: dis_type, viewed: 0, tiding_type: 'Comment', extra: extra
- }
- tidings.create!(base_attrs.merge(user_id: send_user_id))
- end
-
- def validate_sensitive_string
- raise("内容包含敏感词汇,请重新输入") unless HarmoniousDictionary.clean?(content)
- end
- end
|