diff --git a/app/models/bubble.rb b/app/models/bubble.rb index 74f9eb1a9..d84d2c6c5 100644 --- a/app/models/bubble.rb +++ b/app/models/bubble.rb @@ -11,11 +11,16 @@ class Bubble < ApplicationRecord 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")) + scope :left_joins_comments, -> do + left_joins(:messages).merge(Message.left_joins_messageable(:comments)) end + + scope :ordered_by_activity, -> do + left_joins_comments.select("bubbles.*, COUNT(comments.id) + boost_count AS activity").group(:id).order("activity DESC") + end + scope :ordered_by_comments, -> do - left_joins(:messages).merge(Message.comments).group(:id).order("COUNT(messages.id) DESC") + left_joins_comments.select("bubbles.*, COUNT(comments.id) AS comment_count").group(:id).order("comment_count DESC") end scope :with_status, ->(status) do diff --git a/app/models/message.rb b/app/models/message.rb index 45f50f4dd..0e71d3574 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -4,4 +4,8 @@ class Message < ApplicationRecord delegated_type :messageable, types: Messageable::TYPES, inverse_of: :message, dependent: :destroy scope :chronologically, -> { order created_at: :asc, id: :desc } + + scope :left_joins_messageable, ->(messageable_type) do + joins "LEFT OUTER JOIN #{messageable_type} ON messages.messageable_id = #{messageable_type}.id" + end end diff --git a/test/models/bubble_test.rb b/test/models/bubble_test.rb index 64ea36cec..8148e0188 100644 --- a/test/models/bubble_test.rb +++ b/test/models/bubble_test.rb @@ -24,6 +24,15 @@ class BubbleTest < ActiveSupport::TestCase assert_includes Bubble.search("haggis"), bubble end + test "ordering by activity" do + bubbles(:layout).update! boost_count: 1_000 + assert_equal bubbles(:layout, :logo, :shipping, :text), Bubble.ordered_by_activity.to_a + end + + test "ordering by comments" do + assert_equal bubbles(:logo, :layout, :shipping, :text), Bubble.ordered_by_comments.to_a + end + test "mentioning" do bubble = buckets(:writebook).bubbles.create! title: "Insufficient haggis", creator: users(:kevin) bubbles(:logo).capture Comment.new(body: "I hate haggis")