Combler les lacunes d’Active Record… avec Arel et (Baby) Squeel

Arel

Active Record expose une API permettant de construire des requêtes par chainage de méthodes Ruby, évitant les injections SQL en nettoyant les paramètres. L’ennui c’est qu’il est assez fréquent de devoir le contourner pour saisir du SQL manuellement, dû à ses lacunes. Ce qu’on sait moins, c’est qu’Active Record repose sur la bibliothèque Arel qui réalise la génération du code SQL final, compatible entre les différents SGBD supportés.

Et Arel dispose d’une plus grande API qu’Active Record car ce dernier n’implémente pas toutes ses fonctionnalités, par exemple un simple OR n’était pas possible avec la version utilisée dans Ruby on Rails 4. Heureusement, tout objet Active Record contient l’instance de l’objet Arel associé, il est donc possible d’y accéder de cette manière :

Voyons comment réaliser un simple LIKE :

Un OR :

Et on peut générer le « select from where » de cette manière :

Il est conseillé de créer des méthodes dans le Model Active Record afin que les méthodes ajoutées soient plus transparentes à la lecture du code, et pour appliquer les nettoyages de string qui vont bien.

Sources intermédiaires :

Bien. Arel est convainquant et comble ce qu’Active Record ne permet pas de faire, mais il faut reconnaitre à Active Record une syntaxe bien plus sympa de ce qu’il permet de réaliser. Pourquoi ne pas mixer les deux dans une bibliothèque plus haut niveau ?

Squeel

Sur Github, la gem est décrite comme il suit :

Squeel vous permet d’écrire des requêtes Active Record avec moins de caractères, en utilisant la puissance d’Arel qui manque pour rendre Active Record plus accessible

Et tout ça toujours sans toucher à nos modèles, à notre conception de base de données ou aux utilitaires de génération de migrations. Cette bibliothèque n’est plus développée pour Rails 5. Il existe en revanche un fork actif, Baby Squeel, entrepris par un utilisateur de Squeel qui a réalisé le travail compatible Rails 4/5.

Les bases restent les mêmes. Avec Active Record on avait :

Avec Baby Squeel on a :

Version avec l’accès à l’objet (et donc à ses méthodes) :

Like% :

Or :

Jointure simple :

Sous requête :

Baby Squeel permet de requêter sur des tables sans model, de créer des « helpers » et des « snippets de conditions » (un peu comme des scopes), le tout retournant des objets Active Record ou Relation classiques !

Sources :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.