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