Sha256: 0e6f6e5d9c3eb33155dcd0a926caed10c9b0e059f15eda1eef955730cc18f09f

Contents?: true

Size: 1.4 KB

Versions: 5

Compression:

Stored size: 1.4 KB

Contents

module RecordFilter
  class Filter

    delegate :inspect, :to => :loaded_data

    def initialize(clazz, named_filter, combine_conjunction, *args, &block)
      @clazz = clazz

      @dsl = dsl_for_named_filter(@clazz, named_filter)
      @dsl.instance_eval(&block) if block
      @dsl.send(named_filter, *args) if named_filter && @dsl.respond_to?(named_filter)
      @dsl.conjunction.steps.unshift(combine_conjunction.steps).flatten! if combine_conjunction
    end

    def filter(&block)
      Filter.new(@clazz, nil, @dsl.conjunction, &block)
    end

    def method_missing(method, *args, &block)
      if @clazz.respond_to?(method) # UGLY, we need to only pass through things that are named filters.
        Filter.new(@clazz, method, @dsl.conjunction, *args)
      else
        loaded_data.send(method, *args, &block)
      end
    end

    protected

    def loaded_data
      @loaded_data ||= begin
        query = Query.new(@clazz, @dsl.conjunction)
        @clazz.scoped(query.to_find_params)
      end
    end

    def dsl_for_named_filter(clazz, named_filter)
      return DSL::DSL.create(clazz) if named_filter.blank?
      while (clazz)
        dsl = DSL::DSL::SUBCLASSES.has_key?(clazz.name.to_sym) ? DSL::DSL::SUBCLASSES[clazz.name.to_sym] : nil
        return DSL::DSL.create(clazz) if dsl && dsl.instance_methods(false).include?(named_filter.to_s)
        clazz = clazz.superclass
      end
      nil
    end
  end
end

Version data entries

5 entries across 5 versions & 2 rubygems

Version Path
aub-record_filter-0.1.0 lib/record_filter/filter.rb
aub-record_filter-0.1.1 lib/record_filter/filter.rb
aub-record_filter-0.1.2 lib/record_filter/filter.rb
outoftime-record_filter-0.1.0 lib/record_filter/filter.rb
outoftime-record_filter-0.1.1 lib/record_filter/filter.rb