Sha256: 2fa70cf554a87064bc8692a1c2e7d69094405167aef00688d2ccfa984e674632

Contents?: true

Size: 1.5 KB

Versions: 3

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

module FetcheableOnApi
  module Filtreable
    #
    # Supports
    #

    #
    # Public class methods
    #
    def self.included(base)
      base.class_eval do
        extend ClassMethods
        class_attribute :filters_configuration, :instance_writer => false
        self.filters_configuration = {}
      end
    end

    module ClassMethods
      def filter_by(*attrs)
        options = attrs.extract_options!
        options.symbolize_keys!
        options.assert_valid_keys(:as, :class_name)

        self.filters_configuration = filters_configuration.dup

        attrs.each do |attr|
          filters_configuration[attr] ||= {
            as: options[:as] || attr
          }

          filters_configuration[attr] = filters_configuration[attr].merge(options)
        end
      end
    end

    #
    # Public instance methods
    #

    #
    # Protected instance methods
    #
    protected

    def apply_filters(collection)
      return collection if params[:filter].blank?

      filter_params = params.require(:filter)
                            .permit(filters_configuration.keys)
                            .to_hash

      filtering = filter_params.map do |column, value|
        column_name = filters_configuration[column.to_sym].fetch(:as, column)
        klass       = filters_configuration[column.to_sym].fetch(:class_name, collection.klass)

        klass.arel_table[column_name].matches("%#{value}%")
      end

      collection.where(filtering.inject(:and))
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
fetcheable_on_api-0.1.2 lib/fetcheable_on_api/filtreable.rb
fetcheable_on_api-0.1.1 lib/fetcheable_on_api/filtreable.rb
fetcheable_on_api-0.1.0 lib/fetcheable_on_api/filtreable.rb