30 lines
725 B
Ruby
30 lines
725 B
Ruby
# frozen_string_literal: true
|
|
|
|
module RankedTrend
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
scope :by_rank, -> { order(rank: :desc) }
|
|
scope :ranked_below, ->(value) { where(rank: ..value) }
|
|
end
|
|
|
|
class_methods do
|
|
def recalculate_ordered_rank
|
|
connection
|
|
.exec_update(<<~SQL.squish)
|
|
UPDATE #{table_name}
|
|
SET rank = inner_ordered.calculated_rank
|
|
FROM (
|
|
SELECT id, row_number() OVER w AS calculated_rank
|
|
FROM #{table_name}
|
|
WINDOW w AS (
|
|
PARTITION BY language
|
|
ORDER BY score DESC
|
|
)
|
|
) inner_ordered
|
|
WHERE #{table_name}.id = inner_ordered.id
|
|
SQL
|
|
end
|
|
end
|
|
end
|