Нечувствительный поиск в регистре Postgres с Rails

Моя база данных разработки - SQLite, но я развертываю свое приложение в Heroku, и они используют PostgreSQL.

Теперь иногда у меня возникают два разных результата, если я выполняю поиск, потому что PostgreSQL чувствителен к регистру, но SQLite - нет.

Не следует ли Rails стандартизировать эти вещи? Какие методы следует использовать для решения этой проблемы?

Вот как это исправить с помощью raw SQL

Ответ 1

Нечувствительный к регистру поиск в Postgres:

  • используйте ilike вместо like (без учета регистра)
  • если вы хотите использовать =, сделайте обе стороны ВЕРХНИЙ или НИЖНИЙ

Ответ 2

Другим способом обработки этого является citext тип данных или нечувствительный к регистру ТЕКСТ.

Ответ 3

Существует много относительно распространенных вещей, которые ActiveRecord не обрабатывает, и LIKE-сопоставление является одним из них. Вот как это сделать, используя вместо этого прямой Арел.

Model.where(
  Model.arel_table[:title].matches("%#{search_term}%")
)

Вы можете установить Arel-Helpers, чтобы сделать это немного легче

Model.where(Model[:title].matches("%#{search_term}%"))

Я ранее рекомендовал Squeel для этого, но оригинальный создатель остановил его поддержку, и, похоже, поддерживающий его. И поскольку он работает с частными API ActiveRecord, он нуждается в постоянном стремлении.