111 votes

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

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?

Bonus PS - J'essaie en fait 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?

272voto

Pedro Morte Rolo Points 5171

La réponse précédente n'est pas en arel. Celui-ci est:

 users=User.arel_table
User.where(users[:name].matches("%#{user_name}%"))
 

PS:

 users=User.arel_table
query_string = "%#{params[query]}%"
User.where(users[:name].matches(query_string)\
                       .or(users[:description].matches(query_string)))
 

115voto

Reuben Mallaby Points 4602

Essayer

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

PS

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

4voto

cgg5207 Points 31

Essayer

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

PS

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X