diff --git a/app/controllers/concerns/random_seed.rb b/app/controllers/concerns/random_seed.rb new file mode 100644 index 000000000..a54d6832e --- /dev/null +++ b/app/controllers/concerns/random_seed.rb @@ -0,0 +1,10 @@ +module RandomSeed + extend ActiveSupport::Concern + + def set_random_seed + seed = (params[:random_seed] || session[:random_seed] || rand(10_000_000)).to_i + + session[:random_seed] = seed + params[:random_seed] = seed + end +end diff --git a/app/controllers/legislation/processes_controller.rb b/app/controllers/legislation/processes_controller.rb index de4213191..5c796224f 100644 --- a/app/controllers/legislation/processes_controller.rb +++ b/app/controllers/legislation/processes_controller.rb @@ -1,4 +1,6 @@ class Legislation::ProcessesController < Legislation::BaseController + include RandomSeed + has_filters %w[open past], only: :index has_filters %w[random winners], only: :proposals @@ -128,11 +130,4 @@ class Legislation::ProcessesController < Legislation::BaseController return if member_method? @process = ::Legislation::Process.find(params[:process_id]) end - - def set_random_seed - seed = (params[:random_seed] || session[:random_seed] || rand(10_000_000)).to_i - - session[:random_seed] = seed - params[:random_seed] = seed - end end diff --git a/app/models/concerns/randomizable.rb b/app/models/concerns/randomizable.rb new file mode 100644 index 000000000..e632b06ce --- /dev/null +++ b/app/models/concerns/randomizable.rb @@ -0,0 +1,18 @@ +module Randomizable + extend ActiveSupport::Concern + + class_methods do + def sort_by_random(seed) + ids = pluck(:id).shuffle(random: Random.new(seed)) + + return all if ids.empty? + + ids_with_order = ids.map.with_index { |id, order| "(#{id}, #{order})" }.join(", ") + + joins("LEFT JOIN (VALUES #{ids_with_order}) AS ids(id, ordering) ON #{table_name}.id = ids.id") + .order("ids.ordering") + end + + alias_method :random, :sort_by_random + end +end diff --git a/app/models/legislation/proposal.rb b/app/models/legislation/proposal.rb index 531a46387..2f97141b5 100644 --- a/app/models/legislation/proposal.rb +++ b/app/models/legislation/proposal.rb @@ -12,6 +12,7 @@ class Legislation::Proposal < ActiveRecord::Base include Documentable include Notifiable include Imageable + include Randomizable documentable max_documents_allowed: 3, max_file_size: 3.megabytes, @@ -51,20 +52,8 @@ class Legislation::Proposal < ActiveRecord::Base scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } scope :last_week, -> { where("proposals.created_at >= ?", 7.days.ago)} scope :selected, -> { where(selected: true) } - scope :random, -> (seed) { sort_by_random(seed) } scope :winners, -> { selected.sort_by_confidence_score } - def self.sort_by_random(seed) - ids = pluck(:id).shuffle(random: Random.new(seed)) - - return all if ids.empty? - - ids_with_order = ids.map.with_index { |id, order| "(#{id}, #{order})" }.join(", ") - - joins("LEFT JOIN (VALUES #{ids_with_order}) AS ids(id, ordering) ON #{table_name}.id = ids.id") - .order("ids.ordering") - end - def to_param "#{id}-#{title}".parameterize end