Add concerns to set and order by a random seed
This commit is contained in:
10
app/controllers/concerns/random_seed.rb
Normal file
10
app/controllers/concerns/random_seed.rb
Normal file
@@ -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
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
class Legislation::ProcessesController < Legislation::BaseController
|
class Legislation::ProcessesController < Legislation::BaseController
|
||||||
|
include RandomSeed
|
||||||
|
|
||||||
has_filters %w[open past], only: :index
|
has_filters %w[open past], only: :index
|
||||||
has_filters %w[random winners], only: :proposals
|
has_filters %w[random winners], only: :proposals
|
||||||
|
|
||||||
@@ -128,11 +130,4 @@ class Legislation::ProcessesController < Legislation::BaseController
|
|||||||
return if member_method?
|
return if member_method?
|
||||||
@process = ::Legislation::Process.find(params[:process_id])
|
@process = ::Legislation::Process.find(params[:process_id])
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
18
app/models/concerns/randomizable.rb
Normal file
18
app/models/concerns/randomizable.rb
Normal file
@@ -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
|
||||||
@@ -12,6 +12,7 @@ class Legislation::Proposal < ActiveRecord::Base
|
|||||||
include Documentable
|
include Documentable
|
||||||
include Notifiable
|
include Notifiable
|
||||||
include Imageable
|
include Imageable
|
||||||
|
include Randomizable
|
||||||
|
|
||||||
documentable max_documents_allowed: 3,
|
documentable max_documents_allowed: 3,
|
||||||
max_file_size: 3.megabytes,
|
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 :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) }
|
||||||
scope :last_week, -> { where("proposals.created_at >= ?", 7.days.ago)}
|
scope :last_week, -> { where("proposals.created_at >= ?", 7.days.ago)}
|
||||||
scope :selected, -> { where(selected: true) }
|
scope :selected, -> { where(selected: true) }
|
||||||
scope :random, -> (seed) { sort_by_random(seed) }
|
|
||||||
scope :winners, -> { selected.sort_by_confidence_score }
|
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
|
def to_param
|
||||||
"#{id}-#{title}".parameterize
|
"#{id}-#{title}".parameterize
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user