Sha256: 6a3674ee253835a7f63a352d5a5bbed141d22e8c185ef4daab75e5cd305f194f

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

require 'quickfilter/filter'

module Quickfilter
  class QueryBuilder
    attr_reader :klass, :query, :adapter

    def initialize(klass, adapter=nil)
      @klass = klass
      @query = klass.where(nil)
      @associations = klass.reflect_on_all_associations

      @adapter = adapter
      @adapter ||= ActiveRecord::Base.connection_config[:adapter]
    end

    def build(params)
      params.each do |param|
        self.with(param) do |tablename, fieldname, operator, value|
          self.filter(tablename, fieldname, operator, value)
          self.join(tablename) if tablename != @klass.table_name
        end
      end
      return self
    end

    protected
      def filter(tablename, fieldname, operator, value)
        filter = Filter.new(tablename, fieldname, operator, value, @adapter)
        @query = @query.where(filter.build)
        return self
      end

      def join(tablename)
        @query = @query.joins(self.association_for(tablename)) 
        return self
      end

      def with(param)
        param[1].each do |second|
          if second[1].is_a?(Hash)
            second[1].each do |operator, value| 
              next if value.nil?
              yield(param[0], second[0], operator, value)
            end
          else
            next if second[1].nil?
            yield(@klass.table_name, param[0], second[0], second[1])
          end
        end
      end
    
      def association_for(table)
        @associations.each do |assoc|
          return assoc.name if table.to_s == assoc.table_name
        end
      end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
quickfilter-0.1.0 lib/quickfilter/query_builder.rb