J'ai publié récemment une gem résolvant le problème des queries OR dynamics avec active_record. La méthode est inspirée de `#any_of` de mongoid.
Ceci listera les users bannis OU non confirmés :
User.where.any_of({ banned: true }, { confirmed_at: nil })
Il est possible d'utiliser toutes les syntaxes habituelles de `#where` :
@company.users.where.any_of({ banned: true }, [ "confirmed_at = ?, nil ])
Il est également possible de passer comme paramètres des relations, desquelles les conditions seront extraites :
banned = User.where( banned: true )
unconfirmed = User.where( confirmed_at: nil )
inactive_users = User.where.any_of( banned, unconfirmed )
Cela permet de gérer des queries OR dynamiques.
Enfin, une méthode `#none_of` sert de négatif à `#any_of` :
active_users = User.where.none_of({ banned: true }, { confirmed_at: nil })
Cette library est extraite d'un pull request sur rails-core et peut désormais être considérée comme stable.