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
|