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
 |