2010-06-06 3 views
44

Я нахожусь в процессе переключения моей среды разработки с sqlite3 на postgresql 8.4 и имеет один последний барьер.Как сделать регистр без учета регистра в Rails с postgresql

В моем оригинале у меня была следующая строка в вспомогательном методе;

result = Users.find(:all, :order => "name collate NOCASE") 

который обеспечил очень хороший поиск без учета регистра. Я не могу воспроизвести это для postgresql. Должно быть легко - любые идеи?

Спасибо.

ответ

77
result = Users.find(:all, :order => "LOWER(name)") 

Чтобы взять немного от Брэда и Фрэнка.

+0

Nice, который работал спасибо. Направил меня в правильном направлении, чтобы узнать немного больше об этом для себя. Использование UPPER (name) также работает, и на самом деле это то, что оказалось в моем коде - без особых причин. – brad

+2

Более экстремальное решение, к которому я прибегал, - это дополнительная колонка, отслеживающая исходный столбец. Используя триггеры для вставки или обновления, измените этот столбец. Я использовал это в прошлом пару раз, где я хотел сортировать названия чего-то и не хотел, чтобы ведущие слова «a, an, the» учитывались. Я также удалил всех специальных персонажей. Это привело к тому, что «title», «title», «title», «Title» сортировались рядом друг с другом, а не разбросаны. Это также позволило отредактировать сортируемое поле, чтобы я мог сделать «заголовок V» до «title IX». – LanceH

+1

Если вам нужно это на 'default_scope', используйте' default_scope order ('LOWER (name) ASC') '. Мне немного хотелось разобраться в деталях. –

5

В SQL вы можете использовать ORDER BY LOWER (имя столбца), не знаете, как это сделать в Ruby. Функциональный индекс (также на LOWER (имя столбца)) поможет ускорить процесс.

6

Вы считаете, что сохраните свою колонку как citext? Он действительно просто усваивает вызов lower(), как я понимаю. Это было бы автоматически для вас потом. Если есть моменты, когда вам нужен поиск с учетом регистра, это может быть не самая лучшая идея.

+0

Интересно. Для меня это новый тип. Немного чтения показывает, что вам нужно установить модуль citext отдельно, чтобы включить эту функцию в 8.4 (но будет построена до 9.0). Это повлияет на переносимость моего кода, поэтому я оставлю его на данный момент. В настоящее время мне не нужно делать поиск с учетом регистра, но я думаю, что я бы хотел, чтобы этот вариант был открыт в это время, так что оставим это пока. Очень полезно знать, что он существует, хотя так спасибо! – brad

23

популярный ответ LanecH адаптирована для Rails 3 + (включая Rails 4):

users = User.order('LOWER(name)') 

# or create a named scope you can reuse 
class User < ActiveRecord::Base 
    scope :order_by_name, -> { order('LOWER(name)') } 
end 

users = User.order_by_name 
Смежные вопросы