retrospring/app/models/answer.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

79 lines
2.6 KiB
Ruby
Raw Normal View History

2020-04-19 00:59:18 +02:00
class Answer < ApplicationRecord
extend Answer::TimelineMethods
attr_accessor :has_reacted, :is_subscribed
belongs_to :user, counter_cache: :answered_count
belongs_to :question, counter_cache: :answer_count
2014-11-30 19:43:22 +01:00
has_many :comments, dependent: :destroy
has_many :smiles, class_name: "Reaction", foreign_key: :parent_id, dependent: :destroy
2015-04-21 03:12:11 +02:00
has_many :subscriptions, dependent: :destroy
2015-05-04 23:06:57 +02:00
has_many :comment_smiles, through: :comments, source: :smiles
2014-12-14 14:34:51 +01:00
2023-01-01 21:30:41 +01:00
# rubocop:disable Rails/UniqueValidationWithoutIndex
# This cop is disabled here because there already are questions with
# multiple answers. Adding an index would break things database-side
validates :question_id, uniqueness: { scope: :user_id }
2023-01-01 21:30:41 +01:00
# rubocop:enable Rails/UniqueValidationWithoutIndex
2023-01-29 00:56:47 +01:00
scope :pinned, -> { where.not(pinned_at: nil) }
scope :for_user, lambda { |current_user|
next select("answers.*", "false as is_subscribed", "false as has_reacted") if current_user.nil?
select("answers.*",
"EXISTS(SELECT 1
FROM subscriptions
WHERE answer_id = answers.id
AND user_id = #{current_user.id}) as is_subscribed",
"EXISTS(SELECT 1
FROM reactions
WHERE parent_id = answers.id
AND parent_type = 'Answer'
2023-11-27 22:13:56 +01:00
AND user_id = #{current_user.id}) as has_reacted",
)
}
2023-01-29 00:56:47 +01:00
SHORT_ANSWER_MAX_LENGTH = 640
after_create do
InboxEntry.where(user: self.user, question: self.question).destroy_all
user.touch :inbox_updated_at # rubocop:disable Rails/SkipsModelValidations
Notification.notify self.question.user, self unless self.question.user == self.user or self.question.user.nil?
2015-04-21 03:12:11 +02:00
Subscription.subscribe self.user, self
Subscription.subscribe self.question.user, self unless self.question.author_is_anonymous
end
2014-12-28 21:34:42 +01:00
before_destroy do
# mark a report as deleted if it exists
2015-04-30 02:22:24 +02:00
rep = Report.where(target_id: self.id, type: 'Reports::Answer')
2015-04-30 02:04:43 +02:00
rep.each do |r|
unless r.nil?
r.deleted = true
r.save
end
2014-12-28 21:34:42 +01:00
end
2014-12-28 21:20:07 +01:00
self.smiles.each do |smile|
Notification.denotify self.user, smile
end
self.comments.each do |comment|
2015-04-21 03:12:11 +02:00
Subscription.denotify comment, self
2014-12-28 21:20:07 +01:00
end
Notification.denotify question&.user, self
2015-04-21 03:12:11 +02:00
Subscription.destruct self
2014-12-28 21:34:42 +01:00
end
def notification_type(*_args)
Notification::QuestionAnswered
2014-12-28 21:20:07 +01:00
end
def long? = content.length > SHORT_ANSWER_MAX_LENGTH
2023-01-29 00:56:47 +01:00
def pinned? = pinned_at.present?
def has_reacted = self.attributes["has_reacted"] || false
def is_subscribed = self.attributes["is_subscribed"] || false
2014-10-28 06:36:38 +01:00
end