module RsAutocompleteRails::Controller

Public Class Methods

included(target) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 3
def self.included(target)
  target.extend RsAutocompleteRails::Controller::ClassMethods
end

Protected Instance Methods

autocomplete_build_json(results, value_method, label_method, options) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 131
def autocomplete_build_json(results, value_method, label_method, options)
  results.collect do |result|
    data = HashWithIndifferentAccess.new(id: result.id,
                                         label: result.send(label_method),
                                         value: result.send(value_method))
    options[:additional_data].each do |method|
      data[method] = result.send(method)
    end if options[:additional_data]
    data
  end
end
autocomplete_limit_clause(options) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 119
def autocomplete_limit_clause(options)
  options[:limit] ||= 10
end
autocomplete_order_clause(model, value_method, options) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 123
def autocomplete_order_clause(model, value_method, options)
  return options[:order] if options[:order]

  # default to ASC order
  table_prefix = "#{model.table_name}."
  Arel.sql("LOWER(#{table_prefix}#{value_method}) ASC")
end
autocomplete_results(model, value_method, label_method = nil, options, &block) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 75
def autocomplete_results(model, value_method, label_method = nil, options, &block)
  term = params[:term]
  return {} if term.blank?

  results = model.where(nil) # make an empty scope to add select, where, etc, to.
  scopes  = Array(options[:scopes])
  unless scopes.empty?
    scopes.each do |scope|
      if scope.is_a?(Array)
        results = results.send(scope.slice(0), *scope.drop(1))
      else
        results = results.send(scope)
      end
    end
  end
  results = instance_exec(results, &block) if block
  results = results.select(autocomplete_select_clause(model, value_method, label_method, options)) unless
    options[:full_model]
  results.
    where(autocomplete_where_clause(term, model, value_method, options)).
    limit(autocomplete_limit_clause(options)).
    order(autocomplete_order_clause(model, value_method, options))
end
autocomplete_select_clause(model, value_method, label_method, options) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 99
def autocomplete_select_clause(model, value_method, label_method, options)
  table_name = model.table_name
  selects = []
  selects << "#{table_name}.#{model.primary_key}"
  selects << "#{table_name}.#{value_method}"
  selects << "#{table_name}.#{label_method}" if label_method
  options[:additional_data].each { |datum| selects << "#{table_name}.#{datum}" } if options[:additional_data]
  selects
end
autocomplete_where_clause(term, model, value_method, options) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 109
def autocomplete_where_clause(term, model, value_method, options)
  term = term.gsub(/[_%]/) { |x| "\\#{x}" } # escape any _'s or %'s in the search term
  term = "#{term}%"
  term = "%#{term}" if options[:full_search]
  table_name = model.table_name
  lower = options[:case_sensitive] ? '' : 'LOWER'
  ["#{lower}(#{table_name}.#{value_method}) LIKE #{lower}(?)", term] # escape default: \ on postgres, mysql, sqlite
  #["#{lower}(#{table_name}.#{value_method}) LIKE #{lower}(?) ESCAPE \"\\\"", term] # use single-quotes, not double
end
postgres?(model_class) click to toggle source
# File lib/rs_autocomplete_rails/controller.rb, line 143
def postgres?(model_class)
  model_class.connection.class.to_s.match /Postgre/
end