Tester la valeur d'un champ booléen en base de données avec Ruby on Rails et SQLite

Si vous développez un projet utilisant le framework Ruby on Rails et le SGBD SQLite, et qu'à cette occasion vous stockez des valeurs booléennes en base de données (correspondant à autant de champs :boolean dans vos modèles), vous constaterez peut-être qu'une requête comme celle-ci :

articles = Article.all(:conditions => 'active = 1')

...ne fonctionne pas comme vous l'attendiez. En effet, dans un tel environnement, les valeurs booléennes ne sont pas stockées en tant que TINYINT prenant 0 ou 1 comme valeur, mais plutôt comme VARCHAR(1) contenant 't' ou 'f'.

Vous pouvez bien sûr simplement modifier votre requête "en dur", mais cela ne vous garantit pas un fonctionnement correct indépendamment du SGBD utilisé (et il y a fort à parier que SQLite ne fera plus partie du paysage une fois en production).

Dans ce cas, il est préférable de passer directement la valeur booléenne attendue, et de laisser Rails se charger de la préparation de la requête :

Article.all(:conditions => ['active = :active', { :active => true }])

Ainsi, vous pouvez même utiliser une variable ou le retour d'une fonction de manière plus directe !