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.

Commentaires

Vous devez vous inscrire ou vous connecter pour poster un commentaire