Как сделать запрос LIKE в Arel и Rails? - PullRequest
110 голосов
/ 13 декабря 2010

Я хочу сделать что-то вроде:

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?

P.S. Бонус - я на самом деле пытаюсь отсканировать два поля в таблице, как имя, так и описание, чтобы увидеть, есть ли какие-либо совпадения с запросом. Как это будет работать?

Ответы [ 3 ]

267 голосов
/ 10 августа 2011

Вот как вы выполняете подобный запрос в arel:

users = User.arel_table
User.where(users[:name].matches("%#{user_name}%"))

PS:

users = User.arel_table
query_string = "%#{params[query]}%"
param_matches_string =  ->(param){ 
  users[param].matches(query_string) 
} 
User.where(param_matches_string.(:name)\
                       .or(param_matches_string.(:description)))
114 голосов
/ 13 декабря 2010

Попробуйте

User.where("name like ?", "%#{params[:query]}%").to_sql

PS.

q = "%#{params[:query]}%"
User.where("name like ? or description like ?", q, q).to_sql

Да, и это было давно, но @ cgg5207 добавил модификацию (в основном полезную, если вы собираетесь искать по длинному имени илинесколько параметров с длинным именем или вы слишком ленивы для ввода)

q = "%#{params[:query]}%"
User.where("name like :q or description like :q", :q => q).to_sql

или

User.where("name like :q or description like :q", :q => "%#{params[:query]}%").to_sql
3 голосов
/ 08 января 2014

Ответ Рубена Маллаби может быть сокращен, чтобы использовать привязки параметров:

User.where("name like :kw or description like :kw", :kw=>"%#{params[:query]}%").to_sql
...