diff --git a/lib/rails-jquery-autocomplete/autocomplete.rb b/lib/rails-jquery-autocomplete/autocomplete.rb index 4905a75..a9c4bbe 100644 --- a/lib/rails-jquery-autocomplete/autocomplete.rb +++ b/lib/rails-jquery-autocomplete/autocomplete.rb @@ -97,13 +97,20 @@ def get_object(model_sym) # Hash also includes a key/value pair for each method in extra_data # def json_for_autocomplete(items, method, extra_data=[]) - items = items.collect do |item| - hash = HashWithIndifferentAccess.new({"id" => item.id.to_s, "label" => item.send(method), "value" => item.send(method)}) - extra_data.each do |datum| - hash[datum] = item.send(datum) - end if extra_data - # TODO: Come back to remove this if clause when test suite is better - hash + if items.first && items.first.is_a?(Hash) + # Query was a "pluck" and items are already hashes + items.each do |item| + item["label"] = item["value"] = item[method.to_s] + end + else + items = items.collect do |item| + hash = HashWithIndifferentAccess.new({"id" => item.id.to_s, "label" => item.send(method), "value" => item.send(method)}) + extra_data.each do |datum| + hash[datum] = item.send(datum) + end if extra_data + # TODO: Come back to remove this if clause when test suite is better + hash + end end if block_given? yield(items) diff --git a/lib/rails-jquery-autocomplete/orm/active_record.rb b/lib/rails-jquery-autocomplete/orm/active_record.rb index 3754334..69ccee8 100644 --- a/lib/rails-jquery-autocomplete/orm/active_record.rb +++ b/lib/rails-jquery-autocomplete/orm/active_record.rb @@ -26,11 +26,22 @@ def active_record_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] + select_method = options[:select_method] || :select + + if select_method == :select + items = items.select(get_autocomplete_select_clause(model, method, options)) unless options[:full_model] + end items = items.where(get_autocomplete_where_clause(model, term, method, options)). limit(limit).order(order) items = items.where(where) unless where.blank? - + if select_method == :pluck + columns = get_autocomplete_select_clause(model, method, options).uniq + items = items.pluck(*columns) + columns = columns.map do |column| + column.sub(/^#{model.table_name}\./, "") + end + items = items.map { |item| Hash[columns.zip(item)] } + end items end diff --git a/test/lib/rails-jquery-autocomplete/autocomplete_test.rb b/test/lib/rails-jquery-autocomplete/autocomplete_test.rb index 66c636c..9219baf 100644 --- a/test/lib/rails-jquery-autocomplete/autocomplete_test.rb +++ b/test/lib/rails-jquery-autocomplete/autocomplete_test.rb @@ -54,6 +54,7 @@ class AutocompleteTest < Test::Unit::TestCase should 'parse items to JSON' do item = mock(Object) mock(item).send(:name).times(2) { 'Object Name' } + stub(item).is_a?(Hash) { false } mock(item).id { 1 } items = [item] response = self.json_for_autocomplete(items, :name).first @@ -65,6 +66,7 @@ class AutocompleteTest < Test::Unit::TestCase should 'return an instance of HashWithIndifferentAccess' do item = mock(Object) mock(item).send(:name).times(2) { 'Object Name' } + stub(item).is_a?(Hash) { false } mock(item).id { 1 } items = [item] response = self.json_for_autocomplete(items, :name).first @@ -77,6 +79,7 @@ class AutocompleteTest < Test::Unit::TestCase should 'add that extra data to result' do item = mock(Object) mock(item).send(:name).times(2) { 'Object Name' } + stub(item).is_a?(Hash) { false } mock(item).id { 1 } mock(item).send("extra") { 'Object Extra ' }