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?
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)))
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
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