This method was added in Rails 7.0 and makes the code slihgtly more readable. The downside is that it generates two queries instead of one, so it might generate some confusion when debugging SQL queries. Its impact on performance is probably negligible.
54 lines
1.6 KiB
Ruby
54 lines
1.6 KiB
Ruby
class Poll::Question::Option < ApplicationRecord
|
|
self.table_name = "poll_question_answers"
|
|
|
|
include Galleryable
|
|
include Documentable
|
|
|
|
translates :title, touch: true
|
|
translates :description, touch: true
|
|
include Globalizable
|
|
|
|
accepts_nested_attributes_for :documents, allow_destroy: true
|
|
|
|
belongs_to :question, class_name: "Poll::Question"
|
|
has_many :answers, class_name: "Poll::Answer", dependent: :nullify
|
|
has_many :videos, class_name: "Poll::Question::Option::Video",
|
|
dependent: :destroy,
|
|
foreign_key: "answer_id",
|
|
inverse_of: :option
|
|
|
|
validates_translation :title, presence: true
|
|
validates :given_order, presence: true, uniqueness: { scope: :question_id }
|
|
|
|
scope :with_content, -> { excluding(without_content) }
|
|
scope :without_content, -> do
|
|
where(description: "")
|
|
.where.missing(:images)
|
|
.where.missing(:documents)
|
|
.where.missing(:videos)
|
|
end
|
|
|
|
def self.order_options(ordered_array)
|
|
ordered_array.each_with_index do |option_id, order|
|
|
find(option_id).update_column(:given_order, (order + 1))
|
|
end
|
|
end
|
|
|
|
def self.last_position(question_id)
|
|
where(question_id: question_id).maximum("given_order") || 0
|
|
end
|
|
|
|
def total_votes
|
|
Poll::Answer.where(question_id: question, answer: title).count +
|
|
::Poll::PartialResult.where(question: question).where(answer: title).sum(:amount)
|
|
end
|
|
|
|
def total_votes_percentage
|
|
question.options_total_votes.zero? ? 0 : (total_votes * 100.0) / question.options_total_votes
|
|
end
|
|
|
|
def with_read_more?
|
|
description.present? || images.any? || documents.any? || videos.any?
|
|
end
|
|
end
|