Sha256: 9ee9b71d4f8caad50b62bf461945b0f8fc4088f8049652edeb4ef2e00fc6dce4

Contents?: true

Size: 908 Bytes

Versions: 1

Compression:

Stored size: 908 Bytes

Contents

module SearchObject
  class Search
    attr_reader :params

    class << self
      def build_for(config, options)
        scope   = options.fetch(:scope) { config[:scope] && config[:scope].call }
        filters = Helper.stringify_keys(options.fetch(:filters, {}))
        params  = config[:defaults].merge Helper.slice_keys(filters, config[:actions].keys)

        raise MissingScopeError unless scope

        new scope, params, config[:actions]
      end
    end

    def initialize(scope, params, actions)
      @scope    = scope
      @actions  = actions
      @params   = params
    end

    def param(name)
      @params[name]
    end

    def query(context)
      @params.inject(@scope) do |scope, (name, value)|
        new_scope = context.instance_exec scope, value, &@actions[name]
        new_scope || scope
      end
    end

    def count(context)
      query(context).count
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
search_object-1.1.2 lib/search_object/search.rb