diff --git a/app/models/status_trend.rb b/app/models/status_trend.rb index 807efec0ff1..341a5865944 100644 --- a/app/models/status_trend.rb +++ b/app/models/status_trend.rb @@ -19,5 +19,19 @@ class StatusTrend < ApplicationRecord belongs_to :status belongs_to :account - scope :allowed, -> { joins('INNER JOIN (SELECT account_id, MAX(score) AS max_score FROM status_trends GROUP BY account_id) AS grouped_status_trends ON status_trends.account_id = grouped_status_trends.account_id AND status_trends.score = grouped_status_trends.max_score').where(allowed: true) } + scope :allowed, -> { where(allowed: true) } + scope :not_allowed, -> { where(allowed: false) } + scope :with_account_constraint, -> { joins(account_constraint_joins_sql) } + + def self.account_constraint_joins_sql + <<~SQL.squish + INNER JOIN ( + SELECT account_id, MAX(score) AS max_score + FROM status_trends + GROUP BY account_id + ) AS grouped_status_trends + ON status_trends.account_id = grouped_status_trends.account_id + AND status_trends.score = grouped_status_trends.max_score + SQL + end end diff --git a/app/models/trends/status_filter.rb b/app/models/trends/status_filter.rb index da240251fde..1cfde3a84fc 100644 --- a/app/models/trends/status_filter.rb +++ b/app/models/trends/status_filter.rb @@ -49,7 +49,7 @@ class Trends::StatusFilter def trending_scope(value) case value when 'allowed' - StatusTrend.allowed + StatusTrend.with_account_constraint.allowed else StatusTrend.all end diff --git a/app/models/trends/statuses.rb b/app/models/trends/statuses.rb index 9be6eb13a5c..5c33ec144d8 100644 --- a/app/models/trends/statuses.rb +++ b/app/models/trends/statuses.rb @@ -25,7 +25,7 @@ class Trends::Statuses < Trends::Base def to_arel scope = Status.joins(:trend).reorder(score: :desc) scope = scope.reorder(language_order_clause.desc, score: :desc) if preferred_languages.present? - scope = scope.merge(StatusTrend.allowed) if @allowed + scope = scope.merge(StatusTrend.with_account_constraint.allowed) if @allowed scope = scope.not_excluded_by_account(@account).not_domain_blocked_by_account(@account) if @account.present? scope = scope.offset(@offset) if @offset.present? scope = scope.limit(@limit) if @limit.present? @@ -79,8 +79,8 @@ class Trends::Statuses < Trends::Base def request_review StatusTrend.pluck('distinct language').flat_map do |language| - score_at_threshold = StatusTrend.where(language: language, allowed: true).by_rank.ranked_below(options[:review_threshold]).first&.score || 0 - status_trends = StatusTrend.where(language: language, allowed: false).joins(:status).includes(status: :account) + score_at_threshold = StatusTrend.where(language: language).allowed.by_rank.ranked_below(options[:review_threshold]).first&.score || 0 + status_trends = StatusTrend.where(language: language).not_allowed.joins(:status).includes(status: :account) status_trends.filter_map do |trend| status = trend.status