2015-05-04 3 views
4

Я только что переключился с sqlite3 на postgresql-9.4. Раньше, когда я искал свой метод «typeahead», я получал результаты, которые не учитывали регистр. Но теперь, когда я переключился, метод внезапно чувствителен к регистру. Как я могу сделать метод нечувствительным к регистру с postgresql?Как сделать метод поиска postgresql нечувствительным к регистру?

def typeahead 
    q = params[:query] 
    render json: Subject.where('name like ? OR second_name like ? OR keywords like ?', "%#{q}%", "%#{q}%", "%#{q}%") 
end 
+0

Обычно, если у вас есть поле значений, которое вы ищете, перед вставкой необходимо скрыть содержимое до нижнего или верхнего регистра, а затем преобразовать текст поиска в нижний или верхний регистр при поиске. Это позволяет вашему коду работать с любым DBM, не полагаясь на определенные DBM функции. –

ответ

6

Я думаю, что вы можете использовать ILIKE вместо LIKE

Subject.where('name ilike ? OR second_name ilike ? OR keywords ilike ?', "%#{q}%", "%#{q}%", "%#{q}%") 

или упростить немного

Subject.where('name ilike :name OR second_name ilike :name OR keywords ilike :name', name: "%#{q}%") 
+0

Это прекрасно работает, но стоит отметить, что это PostgreSQL. – Drenmi

2

Общий способ сделать это:

Subject.where('LOWER(name) like ?, "%#{q.downcase}%") 

Обратите внимание, что вам, возможно, потребуется создать строчной индекс, если вы страдать от проблем с производительностью. См: How do I create an index in PostgreSQL based on lowercase only?

+0

Я вижу, отличное решение! Могу ли я также выполнить q = params [: query] .downcase', чтобы сэкономить вычислительную мощность? –

+1

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

4

Вы также можете использовать "ILIKE" ключевое слово вместо "как".

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