Ответ 1
Если я правильно понимаю, вы беспокоитесь о "%", появляющемся внутри some_url
и правильно; вам также следует беспокоиться о встроенных подчеркиваниях ( "_" ), они являются LIKE-версией ".". в регулярном выражении. Я не думаю, что есть какой-то конкретный способ Rails, поэтому вы останетесь с gsub
:
.where('url like ?', some_url.gsub('%', '\\\\\%').gsub('_', '\\\\\_') + '%')
Здесь нет необходимости в строковой интерполяции. Вам нужно удвоить обратную косую черту, чтобы избежать их значения из синтаксического анализатора базы данных, чтобы синтаксический анализатор LIKE увидел простой "\%" и знал, чтобы игнорировать знак с экранированным процентом.
Вы должны проверить свои журналы, чтобы убедиться, что пройдут две обратные косые черты. Я получаю запутывающие результаты от проверки вещей в irb
, используя пять (!) Получает правильный вывод, но я не вижу смысла в нем; если кто-нибудь увидит смысл в пяти из них, будет оценен пояснительный комментарий.
ОБНОВЛЕНИЕ: Джейсон Кинг любезно предложил упрощение для кошмара беглых персонажей. Это позволяет указать временный escape-символ чтобы вы могли делать такие вещи:
.where("url LIKE ? ESCAPE '!'", some_url.gsub(/[!%_]/) { |x| '!' + x })
Я также переключился на блочную форму gsub
, чтобы сделать ее менее неприятной.
Это стандартный синтаксис SQL92, поэтому он будет работать в любой базе данных, поддерживающей это, включая PostgreSQL, MySQL и SQLite.
Встраивание одного языка внутри другого - это всегда кошмарный кудд, и вы не можете этого сделать. Всегда будут уродливые кусочки, которые вам просто нужно усмехаться и нести.