Я хочу сделать что-то вроде:
SELECT * FROM USER WHERE NAME LIKE '%Smith%';
Моя попытка в Ареле:
# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
Однако это становится:
SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Арел правильно оборачивает строку запроса «Смит», но поскольку это оператор LIKE, он не работает.
Как выполнить запрос LIKE в Arel?
PS Бонус - я на самом деле пытаюсь просканировать два поля в таблице, имя и описание, чтобы увидеть, есть ли какие-либо совпадения с запросом. Как это будет работать?
Ответы:
Вот как вы выполняете подобный запрос в arel:
PS:
источник
where("name like ?", ...)
, этот подход более переносим для разных баз данных. Например, это может привестиILIKE
к использованию в запросе к базе данных Postgres.User.where(users[:name].matches("%#{params[:user_name]}%"))
, я пробовалTRUNCATE users;
и другие подобные запросы, и на стороне sql ничего не произошло. Мне кажется, это безопасно..gsub(/[%_]/, '\\\\\0')
для экранирования подстановочных знаков MySql.Пытаться
PS.
Да, прошло много времени, но @ cgg5207 добавил модификацию (в основном полезно, если вы собираетесь искать параметры с длинными именами или несколько параметров с длинными именами или вам лень вводить текст)
или
источник
%
в подставленной строке не нужно экранировать ? Похоже, что если вам нужен только односторонний подстановочный знак, ничто не%
мешает пользователю отправить значение запроса, которое включает в себя с обоих концов (я знаю, что на практике Rails предотвращает%
отображение в строке запроса, но похоже, что там должна быть защита от этого на уровне ActiveRecord).to_sql
или менеджер arel, как выполнить sql на db?Ответ Рубена Маллаби можно сократить, чтобы использовать привязки параметров:
источник