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

问题描述 投票:0回答:4

我想做这样的事情:

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 中进行 LIKE 查询?

附注额外的好处 - 我实际上正在尝试扫描表上的两个字段(名称和描述),以查看是否有与查询匹配的内容。这将如何运作?

ruby-on-rails activerecord arel
4个回答
291
投票

这是在 arel 中执行类似查询的方式:

users = User.arel_table
User.where(users[:name].matches("%#{sanitize_sql_like(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)))

119
投票

尝试

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

PS.

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

Aa已经很长时间了,但是@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

0
投票

不要忘记转义用户输入。 您可以使用

ActiveRecord::Base.sanitize_sql_like(w)

query = "%#{ActiveRecord::Base.sanitize_sql_like(params[:query])}%"
matcher = User.arel_table[:name].matches(query)
User.where(matcher)

您可以简化为

models/user.rb

def self.name_like(word)
  where(arel_table[:name].matches("%#{sanitize_sql_like(word)}%"))
end
© www.soinside.com 2019 - 2024. All rights reserved.