Sha256: ad511a86f871d0300fc1fff09393bea4c921030cd67935a4dbff5d53cf69942a
Contents?: true
Size: 1.77 KB
Versions: 1
Compression:
Stored size: 1.77 KB
Contents
module ActiveRecordSamplooper class << self def call(*args) ready(*args) end def ready(klass) Samplooper.new(klass) end end class ArrayLooper attr_accessor :array class << self def call(*args) new(*args) end end def initialize(array) self.array = array.dup end def find(id) raise ActiveRecord::RecordNotFound unless id array[id - 1] || raise(Gone, id) end def pluck(*) (1..array.size).to_a end end class Samplooper attr_accessor :klass, :id_store, :rest def initialize(klass) self.klass = klass init! end def find(id) klass.find(id) rescue ActiveRecord::RecordNotFound => e raise Gone, id end def sample(count = 1) count > 1 ? count.times.map { do_sample } : do_sample end def pick(count = 1) count > 1 ? count.times.map { do_pick } : do_pick end def loop(count = 1) count > 1 ? count.times.map { do_loop } : do_loop end def init! self.id_store = klass.pluck(:id).shuffle! reset! end def reset! self.rest = id_store.dup end private def do_sample find(id_store.sample) end def do_pick return if rest.blank? find(rest.shift) end def do_loop reset! if rest.blank? pick end end class Gone < StandardError attr_accessor :id def initialize(id) self.id = id end end end class ::Array def sampler ActiveRecordSamplooper.(ActiveRecordSamplooper::ArrayLooper.(self)) end end class ::ActiveRecord::Base class << self def sample offset(rand(count(:all))).first end def sampler ActiveRecordSamplooper.(self) end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
active_record_samplooper-0.0.4 | lib/active_record_samplooper.rb |