From 25355a984051f4fc237e17e8eff5a77b47586a09 Mon Sep 17 00:00:00 2001 From: Jana Dvorakova <jana.dvorakova@kraxnet.cz> Date: Wed, 16 May 2012 18:14:10 +0200 Subject: [PATCH] searching using active_record scope --- .../orm/active_record.rb | 19 +++++++++++++++---- .../orm/active_record_test.rb | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/lib/rails3-jquery-autocomplete/orm/active_record.rb b/lib/rails3-jquery-autocomplete/orm/active_record.rb index 9606c0f2..124a3866 100644 --- a/lib/rails3-jquery-autocomplete/orm/active_record.rb +++ b/lib/rails3-jquery-autocomplete/orm/active_record.rb @@ -13,6 +13,7 @@ def get_autocomplete_items(parameters) term = parameters[:term] method = parameters[:method] options = parameters[:options] + search_scope = options[:search_scope] scopes = Array(options[:scopes]) where = options[:where] limit = get_autocomplete_limit(options) @@ -24,8 +25,14 @@ def get_autocomplete_items(parameters) scopes.each { |scope| items = items.send(scope) } unless scopes.empty? items = items.select(get_autocomplete_select_clause(model, method, options)) unless options[:full_model] - items = items.where(get_autocomplete_where_clause(model, term, method, options)). - limit(limit).order(order) + + if search_scope.blank? + items = items.where(get_autocomplete_where_clause(model, term, method, options)) + else + items = items.send(search_scope, get_autocomplete_term_for_like(term, options)) + end + + items = items.limit(limit).order(order) items = items.where(where) unless where.blank? items @@ -38,9 +45,13 @@ def get_autocomplete_select_clause(model, method, options) def get_autocomplete_where_clause(model, term, method, options) table_name = model.table_name - is_full_search = options[:full] like_clause = (postgres?(model) ? 'ILIKE' : 'LIKE') - ["LOWER(#{table_name}.#{method}) #{like_clause} ?", "#{(is_full_search ? '%' : '')}#{term.downcase}%"] + ["LOWER(#{table_name}.#{method}) #{like_clause} ?", get_autocomplete_term_for_like(term, options)] + end + + def get_autocomplete_term_for_like(term, options) + is_full_search = options[:full] + "#{(is_full_search ? '%' : '')}#{term.downcase}%" end def postgres?(model) diff --git a/test/lib/rails3-jquery-autocomplete/orm/active_record_test.rb b/test/lib/rails3-jquery-autocomplete/orm/active_record_test.rb index e56dc705..1b23ae72 100644 --- a/test/lib/rails3-jquery-autocomplete/orm/active_record_test.rb +++ b/test/lib/rails3-jquery-autocomplete/orm/active_record_test.rb @@ -81,6 +81,24 @@ class Dog ; end end end + context '#get_autocomplete_term_for_like' do + setup do + @term = 'query' + @options = {} + end + + should 'return term with % added' do + assert_equal "query%", get_autocomplete_term_for_like(@term, @options) + end + + context 'full search' do + should 'return term sourrounded by %%' do + @options[:full] = true + assert_equal "%query%", get_autocomplete_term_for_like(@term, @options) + end + end + end + context '#get_autocomplete_where_clause' do setup do @model = Object.new