Sha256: b032d46de6fa5343b5cbb3742a72256e70a2a79c1b6dc416318761c16eb0e7b3

Contents?: true

Size: 789 Bytes

Versions: 2

Compression:

Stored size: 789 Bytes

Contents

require 'simple_searchable/version'

module SimpleSearchable
  module SearchableBy
    def searchable_by(*method_names)
      self.singleton_class.send(:define_method, :search) do |opts|
        return all if opts.nil?

        filter_all(method_names, opts)
      end

      self.send(:extend, FilterMethods)
    end

    module FilterMethods
      def filter(name, arg)
        arg.present? ? send(name, arg) : all
      end

      def filter_all(names, opts)
        result = self.all
        names.each do |n|
          unless opts[n].blank?
            opts[n].reject!(&:blank?) if opts[n].is_a?(Array)
            result = result.filter(n, opts[n])
          end
        end
        result
      end
    end
  end
end

ActiveRecord::Base.send(:extend, SimpleSearchable::SearchableBy)

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
simple_searchable-1.0.0 lib/simple_searchable.rb
simple_searchable-0.1.0 lib/simple_searchable.rb