Как сделать запрос LIKE в Arel и Rails?
Я хочу сделать что-то вроде:
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'%';
Arel корректно завершает строку запроса "Смит", но поскольку это оператор LIKE, он не работает.
Как сделать запрос LIKE в Arel?
P.S. Бонус - на самом деле я пытаюсь сканировать два поля в таблице, как имя, так и описание, чтобы узнать, есть ли какие-либо соответствия запросу. Как это работает?
Ответы
Ответ 1
Вот как вы выполняете подобный запрос в isl:
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)))
Ответ 2
Try
User.where("name like ?", "%#{params[:query]}%").to_sql
PS.
q = "%#{params[:query]}%"
User.where("name like ? or description like ?", q, q).to_sql
Aaand это было долгое время, но @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
Ответ Reuben Mallaby может быть сокращен далее, чтобы использовать привязки параметров:
User.where("name like :kw or description like :kw", :kw=>"%#{params[:query]}%").to_sql