Sha256: 15d6269660c16334eaf7d5be08bf884a641d0da4fbfc78a39789b60d7d5cb7ee

Contents?: true

Size: 1.78 KB

Versions: 1

Compression:

Stored size: 1.78 KB

Contents

module ActiveRecord
  module Filters
    class Filter
      include ActiveRecord::Filters::Base

      attr_accessor :klass
      attr_accessor :attributes
      attr_accessor :options

      def initialize(klass, attributes, options)
        self.klass      = klass
        self.attributes = attributes
        self.options    = options
      end

      def call(params)
        relation = scoped

        columns.inject(relation) do |relation, column|
          # TODO: have a better way to compare this?
          param = if association? && relation.arel_table != column.relation
                    key = "#{association.name}_attributes"
                    params[key][column.name] if params[key]
                  else
                    params[column.name]
          end

          next relation if param.blank?

          column_name = klass.arel_table[column.name]

          case column.type
          when :string
            relation.where(column_name.matches("#{param}%"))
          when :decimal, :float, :integer
            relation.where(column_name.eq(I18n::Alchemy::NumericParser.parse(param)))
          when :time
            # TODO: why arel uses arel/attributes/time for date columns?
            relation.where(column_name.eq(I18n::Alchemy::DateParser.parse(param)))
          else
            relation.where(column_name.eq(param))
          end
        end
      end

      protected

      def columns
        @columns ||= begin
          columns = attributes.map do |attribute|
            find_column(klass, attribute)
          end

          if association
            columns += association.klass.accessible_attributes.map do |attribute|
              find_column(association.klass, attribute)
            end
          end

          columns.compact
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
unico-training-7.8.0 lib/active_record/filters/filter.rb