Sha256: e0e4ab96d3236205e27dc471e11c413a4f6d4facfda13319b2014cad73645b54

Contents?: true

Size: 1.02 KB

Versions: 1

Compression:

Stored size: 1.02 KB

Contents

module ActiveRecordSamplooper
  class << self
    def call(*args)
      ready(*args)
    end


    def ready(klass)
      Samplooper.new(klass)
    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
      find(id_store.sample)
    end


    def pick
      return if rest.blank?
      find(rest.shift)
    end


    def loop
      reset! if rest.blank?
      sample
    end


    def init!
      self.id_store = klass.pluck(:id).shuffle!
      self.rest = id_store.dup
    end


    def reset!
      self.rest = id_store.dup
    end
  end

  class Gone < StandardError
    attr_accessor :id


    def initialize(id)
      self.id = id
    end
  end
end

class ::ActiveRecord::Base
  class << self
    def sample
      offset(rand(count)).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.2 lib/active_record_samplooper.rb