Sha256: e7b00c394d9f46701402b0c6fe2248a6a8f32605e53c1e47691643857bba9778

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 KB

Contents

module Casino
  class Store
    attr_accessor :collection_name

    delegate :drop, :find, :indexes, :insert, to: :collection

    delegate :count, :distinct, :each, :first, :limit, :remove, :remove_all,
      :select, :skip, :sort, :update, :update_all, :upsert, to: :query

    delegate :where, :in, to: :criteria

    def initialize(collection_name)
      self.collection_name = collection_name
    end

    def collection
      @collection ||= session[collection_name.to_sym]
    end

    def query
      @query ||= collection.find
    end

    def merge(*documents)
      documents.each do |document|
        document = mongoize document
        criteria = find _id: document['_id']
        criteria.upsert document
      end
    end

    def criteria
      @criteria ||= build_criteria
    end

    def mongoize(hash)
      hash.keys.map { |key| build_mongoized_hash(hash, key) }.reduce(&:merge)
    end

    private

    def session
      @session ||= Mongoid.default_session
    end

    def build_criteria
      klass = Class.new
      klass.send(:include, Mongoid::Document)
      klass.store_in collection: collection_name
      klass.scoped
    end

    def evolve(value)
      value.class.respond_to?(:evolve) ? value.class.evolve(value) : value
    end

    def build_mongoized_hash(hash, key)
      value = hash[key]
      value = value.is_a?(Hash) ? mongoize(value) : value
      { key => evolve(value) }
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mongoid-casino-0.0.3 lib/casino/store.rb