Как сделать подобный запрос в 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 правильно обертывает строку запроса "Smith", но поскольку это оператор LIKE, он не работает.
как сделать подобный запрос в Arel?
P.S. бонус-я на самом деле пытаюсь сканировать два поля в таблице, как имя, так и описание, чтобы увидеть, есть ли какие-либо совпадения с запросом. Как бы то ни было работа?
3 ответа:
вот как вы выполняете подобный запрос в 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)))
попробовать
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