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