Как сделать регистр без учета регистра в Rails с помощью postgresql - PullRequest
50 голосов
/ 06 июня 2010

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

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

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

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

Спасибо.

Ответы [ 5 ]

79 голосов
/ 06 июня 2010
result = Users.find(:all, :order => "LOWER(name)")

Немного от Брэда и Фрэнка.

24 голосов
/ 21 июня 2014

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

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

Или создайте именованную область, которую вы можете использовать повторно:

class User < ActiveRecord::Base
  scope :order_by_name, -> { order('LOWER(name)') }
end

users = User.order_by_name
16 голосов
/ 01 мая 2018

Теперь с Rails 5.2 вы, вероятно, получите предупреждение, если используете принятый ответ.

ПРЕДУПРЕЖДЕНИЕ ОБ УСТРАНЕНИИ: Опасный метод запроса (метод, аргументы которого используются в качестве необработанного SQL), вызываемого с неатрибутным аргументом (ами): "LOWER (?) ASC».

Альтернативой может быть использование Arel (теперь он объединен с Rails):

results = User.order(User.arel_table['name'].lower.asc)
# results.to_sql == "SELECT \"users\".* FROM \"users\" ORDER BY LOWER(\"users\".\"name\") ASC" 
6 голосов
/ 07 июня 2010

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

5 голосов
/ 06 июня 2010

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

...