class Manage::Fields::Searcher

Public Class Methods

escape_search_term(term) click to toggle source
# File lib/manage/fields/searcher.rb, line 9
def escape_search_term(term)
  "%#{term.gsub(/\s+/, '%').gsub('.', '_')}%".downcase
end
generate_search_object(resource_class, search_fields) click to toggle source
# File lib/manage/fields/searcher.rb, line 5
def generate_search_object(resource_class, search_fields)
  search_class = Class.new do
    include SearchObject.module(:model, :sorting)

    def escape_search_term(term)
      "%#{term.gsub(/\s+/, '%').gsub('.', '_')}%".downcase
    end

    def parse_date(date)
      Date.strptime(date, '%Y-%m-%d') rescue nil
    end
  end


  search_class.scope { resource_class.all }
  Object.const_set("#{resource_class.name.gsub(/:/, '')}Searcher", search_class)

  search_fields.select {|f| not f.to_s.include?('.')}.each do |field|
    field_type = resource_class.columns_hash[field.to_s].type
    case field_type
    when *[:text, :string]
      search_class.option field.to_sym do |scope, value|
        value.blank? ? scope : scope.where("lower(#{field.to_s}) LIKE lower(?)", escape_search_term(value))
      end
    when :datetime
      search_class.option field.to_sym do |scope, value|
        date = parse_date value
        scope.where("DATE(#{field.to_s}) >= ?", date) if date.present?
      end
    when :integer
      search_class.option field.to_sym
    when :boolean
      search_class.option field.to_sym
    else
      search_class.option field.to_sym do |scope, value|
        scope.where "#{field.to_s} = '?'", escape_search_term(value)
      end
    end
  end

  search_class
end
parse_date(date) click to toggle source
# File lib/manage/fields/searcher.rb, line 13
def parse_date(date)
  Date.strptime(date, '%Y-%m-%d') rescue nil
end