Sha256: ee06a684f6b9d4b7241548de5755df30f488389701fa670846201981f88bfbb5

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

module ActsAsFilterable
  
  Filters = returning Hash.new([]) do |f|
    f[:digits]     = lambda { |attr| attr.gsub!(/[^\d]*/, "") }
    f[:lowercase]  = lambda { |attr| attr.downcase! }
    f[:uppercase]  = lambda { |attr| attr.upcase! }
    f[:whitespace] = lambda { |attr| attr.gsub!(/\s+/, " "); attr.strip! }
  end.freeze
  
  module ActiveRecordExt
    
    module Base
      
      def self.included(klazz)
        klazz.extend ClassMethods
        klazz.before_validation :apply_filters
      end
      
      module ClassMethods
        
        def self.extended(klazz)
          ActsAsFilterable::Filters.each_key do |key|
            klazz.class_eval <<-MACROS, __FILE__, __LINE__ + 1
              def self.filter_for_#{key}(*args)
                filtered_attributes[:#{key}] |= args unless args.empty?
              end
            MACROS
          end
        end
        
        def filtered_attributes
          @filtered_attributes ||= Hash.new []
        end

      end
      
      protected
     
      def apply_filters
        self.class.filtered_attributes.each do |key, value|
          value.each do |attr|
            apply_filter self, attr, ActsAsFilterable::Filters[key]
          end
        end
      end
      
      private
      
      def apply_filter(record, attr, filter)
        filter.call(record[attr]) if record[attr].is_a?(String)
      end
            
    end
  
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
acts_as_filterable-0.2.0 lib/acts_as_filterable/base.rb