web-dev-qa-db-fra.com

Comment faire une requête LIKE dans Arel et Rails?

Je veux faire quelque chose comme:

SELECT * FROM USER WHERE NAME LIKE '%Smith%';

Ma tentative à Arel:

# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql

Cependant, cela devient:

SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';

Arel encapsule correctement la chaîne de requête 'Smith', mais comme il s'agit d'une instruction LIKE, cela ne fonctionne pas.

Comment fait-on une requête LIKE dans Arel?

P.S. Bonus - J'essaie en réalité d'analyser deux champs de la table, le nom et la description, pour voir s'il y a des correspondances avec la requête. Comment cela fonctionnerait-il?

110
filsa

Voici comment effectuer une requête similaire dans 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)))
267
Pedro Morte Rolo

Essayer

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

PS.

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

Cela fait longtemps mais @ cgg5207 a ajouté une modification (surtout utile si vous recherchez des paramètres portant un nom long ou plusieurs, ou si vous êtes trop paresseux pour le saisir)

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

ou

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

La réponse de Reuben Mallaby peut être abrégée pour utiliser des liaisons de paramètres:

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