我想做类似的事情:
SELECT * FROM USER WHERE NAME LIKE '%Smith%';
我在Arel的尝试:
# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
然而,这变为:
SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Arel正确地包装查询字符串'Smith',但因为这是一个LIKE语句,所以它不起作用。
如何在Arel中进行LIKE查询?
P.S。奖金 - 我实际上是在尝试扫描表格上的两个字段,包括名称和描述,以查看是否与查询匹配。这会怎么样?
答案 0 :(得分:266)
这是你在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)))
答案 1 :(得分:114)
尝试
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
答案 2 :(得分:3)
Reuben Mallaby的答案可以进一步缩短以使用参数绑定:
User.where("name like :kw or description like :kw", :kw=>"%#{params[:query]}%").to_sql