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 faire une requête LIKE dans Arel?
Bonus PS - J'essaie en fait de scanner 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?
Réponses:
Voici comment vous effectuez une requête similaire dans arel:
PS:
la source
where("name like ?", ...)
, cette approche est plus portable dans différentes bases de données. Par exemple, cela entraîneraitILIKE
une utilisation dans une requête sur une base de données Postgres.User.where(users[:name].matches("%#{params[:user_name]}%"))
, j'ai essayéTRUNCATE users;
et d'autres requêtes similaires et rien ne s'est passé du côté SQL. Cela me semble sûr..gsub(/[%_]/, '\\\\\0')
pour échapper les caractères génériques MySql.Essayer
PS.
Et ça fait longtemps mais @ cgg5207 a ajouté une modification (surtout utile si vous allez rechercher des paramètres à nom long ou plusieurs paramètres à nom long ou si vous êtes trop paresseux pour taper)
ou
la source
%
dans la chaîne substituée? Il semble que si vous ne vouliez qu'un caractère générique unilatéral, rien n'empêche l'utilisateur de soumettre une valeur de requête qui inclut%
aux deux extrémités (je sais qu'en pratique, Rails empêche%
d'apparaître dans une chaîne de requête, mais il semble y avoir devrait être une protection contre cela au niveau ActiveRecord).to_sql
ou arel manager, comment exécuter le sql sur db?La réponse de Reuben Mallaby peut être raccourcie pour utiliser les liaisons de paramètres:
la source