[ Pob's corner ]

Rails : utilisation de REGEXP

November 03, 2015 | about 1 minute read

Petite mise en situation : nous sommes sur un vieux projet Rails 3 avec une table ayant une colonne (genre) qui stocke une ou plusieurs valeurs séparées par une virgule (la conception est faite de la sorte, on va dire que c’est un cas particulier).

On peut donc retrouver certaines lignes de notre table avec pour valeurs des choses comme “mot1” ou “mot1,mot2,mot3” ou encore “mot1,mot3” etc…

Partons du principe que l’on a un formulaire avec des cases à cocher mot1, mot2, mot3, mot4, mot5 et que l’on souhaite récupérer toutes les lignes de notre table contenant dans la colonne “genre” les cases cochées.

La solution en SQL serait de faire un “LIKE” en séparant toutes les possibilités avec un “OR”. Sauf que dans notre cas on ne sait pas combien de OR on devra faire, c’est dynamique.

Pour éviter de faire une boucle sur les cases cochées, nous nous sommes penchés sur l’opérateur “REGEXP” qui va nous permettre de faire notre recherche sur un tableau de valeurs (contenant une ou plusieurs valeurs en fonction du nombre de cases cochées dans le form).

mon_hash = { "mot1"=>"Mot 1", "mot2"=>"Mot 2", "mot3"=>"Mot 3" }
MonObjet.where("genre REGEXP ?", mon_hash.values.join('|'))

Cela nous permet de matcher les lignes comprenant l’une des valeurs de notre hash. Libre à vous d’utiliser la bonne expression régulière en fonction de votre besoin.

Originally published at Sois-net.