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 |