51 lines
1.4 KiB
Ruby
51 lines
1.4 KiB
Ruby
class Bubble < ApplicationRecord
|
|
include Assignable, Boostable, Colored, Eventable, Messages, Poppable, Searchable, Staged, Taggable
|
|
|
|
belongs_to :bucket
|
|
belongs_to :creator, class_name: "User", default: -> { Current.user }
|
|
|
|
has_one_attached :image, dependent: :purge_later
|
|
|
|
before_save :set_default_title
|
|
|
|
scope :reverse_chronologically, -> { order created_at: :desc, id: :desc }
|
|
scope :chronologically, -> { order created_at: :asc, id: :asc }
|
|
|
|
scope :ordered_by_activity, -> do
|
|
left_joins(:messages).merge(Message.comments).group(:id).order(Arel.sql("COUNT(messages.id) + boost_count DESC"))
|
|
end
|
|
scope :ordered_by_comments, -> do
|
|
left_joins(:messages).merge(Message.comments).group(:id).order("COUNT(messages.id) DESC")
|
|
end
|
|
|
|
scope :with_status, ->(status) do
|
|
status = status.presence_in %w[ popped active unassigned ]
|
|
public_send(status) if status
|
|
end
|
|
|
|
scope :ordered_by, ->(order) do
|
|
case order
|
|
when "most_active" then ordered_by_activity
|
|
when "most_discussed" then ordered_by_comments
|
|
when "most_boosted" then ordered_by_boosts
|
|
when "newest" then reverse_chronologically
|
|
when "oldest" then chronologically
|
|
end
|
|
end
|
|
|
|
class << self
|
|
def default_order_by
|
|
"most_active"
|
|
end
|
|
|
|
def default_status
|
|
"active"
|
|
end
|
|
end
|
|
|
|
private
|
|
def set_default_title
|
|
self.title = title.presence || "Untitled"
|
|
end
|
|
end
|