2012-01-26 3 views
1

У меня есть БД в Рубине файла семян, который создает городов в США, а именно:автозаполнения и как дать ему понять, строчных и заглавных

City.create(:name => "Sausalito,CA", :state => "CA") 

Однако при тестировании автозаполнения, база данных распознает только каждое предварительно загруженное местоположение, если я правильно отформатирован.

Таким образом, он будет видеть «Sausolito, CA» в качестве входных данных, но не «sausolito, ca» как один.

Является ли это легким решением проблемы с db или это проблема с полем поиска?

Спасибо!

EDIT: Вот вызов:

class CitiesController < ApplicationController 
    def autocomplete 

    render :json => City.autocomplete_name(params[:term]).collect{ |city| {:value => city.id, :label => "#{city.name}"} } 


    end 

end 

AC:

class City < ActiveRecord::Base 

    attr_accessible :name, :state 
has_many :searches 

scope :autocomplete_name, lambda {|name| 

    where("cities.name LIKE ?", "#{name}%") 
} 

end 
+0

jQueryUI - это то, что вы имеете в виду? – user686327

+1

Нет, теперь вы загружаете значения из своей базы данных? Предварительно загружены ли они на страницу или автозаполнение вызовет метод на вашем контроллере всякий раз, когда вы начинаете вводить текст? Я бы опубликовал больше кода о том, как именно настроен ваш автозаполнение. –

+0

Метод вызывается на контроллере, когда пользователь вводит первую букву ... позвольте мне добавить код в исходное сообщение. – user686327

ответ

1

Какую базу данных вы ищете против? Для MySQL, вы можете использовать Order By пункта для достижения случая нечувствительности - смотрите ниже ....

Кроме того, я нашел, что это странно, что STRCMP() чувствительно к регистру, но ORDER BY является нечувствительным к регистру.

Здесь вы можете найти более подробную информацию. Даже я задавался вопросом, что в некоторых ситуациях выбор MySQL нечувствителен к регистру, но я действительно не инвестировал время в выяснение того, почему это было непротиворечиво, сегодня я это узнал!

http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

Лучший подход будет загружать все эти записи в память, и хранение строчных версии этих строк. Ваша производительность будет намного лучше, чем ударить базу данных для возможности автозаполнения.

+0

Он использует sqlite –

+0

Хорошо. Разве он не должен кэшировать результаты в памяти? Если есть очень ограниченный трафик, я не могу представить базу данных (это тоже sqlite), поддерживающую все эти автозавершающие вызовы ajax! – smallworld

+0

SQLite только для локального тестирования :) – user686327

1

Если база данных загружается с помощью запросов SELECT * FROM xyz WHERE name LIKE '$typed%' типа запроса на, вы могли бы использовать SELECT * FROM xyz WHERE LOWER(name) LIKE LOWER("$typed%")

+0

И не вставляйте переменную в запрос. Это отличный способ взломать SQL-инъекцию. –

+0

Давайте сделаем вид, что строка над этим является '$ typed = mysql_real_escape_string ($ typed);', mmk? – Tim

+0

Похоже, SQLite поддерживает функцию 'lower()'. 'где (" lower (cities.name) LIKE lower (?) "," # {name}% ")'. И дезинфекция материалов - это независимая от языка концепция. – Tim

Смежные вопросы