簡體   English   中英

如何在 Arel 和 Rails 中執行 LIKE 查詢?

[英]How to do a LIKE query in Arel and 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 中執行 LIKE 查詢?

PS Bonus--我實際上是在嘗試掃描表上的兩個字段,名稱和描述,以查看是否有任何匹配的查詢。 這將如何運作?

這是你在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

Reuben Mallaby的答案可以進一步縮短以使用參數綁定:

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

不要忘記轉義用戶輸入。 您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM