Не чувствительный к регистру поиск с активной записью - PullRequest
5 голосов
/ 19 февраля 2011

Я использую рельсы 3.0.4

Вот часть запроса Arel в моем приложении rails. Как я могу использовать метод upcase, чтобы сделать поиск без учета регистра в базе данных?

Customer.where("company_id = ? and (firstname like ? or lastname like ? or reference like ?)", current_user.company_id, "%#{params[:query]}%", "%#{params[:query]}%", "%#{params[:query]}%")

Спасибо

1 Ответ

12 голосов
/ 19 февраля 2011

Вот несколько вариантов для вас.

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

Customer.where('firstname LIKE ?', "%john%").first.name
=> 'John'

Во-вторых, если вы хотите сравнить использование нечувствительности к регистру с сопоставлениями, не соответствующими шаблону, такими как <>, =, <= и т. д., то вы можете использоватькоманда COLLATE для наложения нечувствительных к регистру совпадений: </p>

Customer.where('firstname COLLATE utf8_unicode_ci = ?', 'john').first.name
=> 'John'

Кажется, что у Postgres еще нет команды COLLATE , но вы можете узнать больше о параметрах поиска без учета регистра здесь .В общем, когда вы хотите выполнить сопоставление с образцом или сложные запросы, вы не сможете сделать это независимо от базы данных.Я рекомендую использовать единую систему баз данных как при разработке, так и при производстве.Это гарантирует, что ваши запросы также будут вести себя одинаково в обеих средах, что должно привести к уменьшению количества ошибок.Если вы обнаружите необходимость поддержки нескольких систем баз данных, то лучше всего просто создать два разных запроса - один для запуска на MySQL и один для запуска на Postgres, например.

...