如何在Arel和Rails中进行LIKE查询?

时间:2010-12-13 15:45:54

标签: ruby-on-rails activerecord arel

我想做类似的事情:

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。奖金 - 我实际上是在尝试扫描表格上的两个字段,包括名称和描述,以查看是否与查询匹配。这会怎么样?

3 个答案:

答案 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