2010-08-02 4 views
5

J'ai une table d'utilisateurs avec un champ de masque de bits qui a un masque d'autorisations. Localement, je peux déterminer si un utilisateur a une certaine autorisation en faisant un bitmask (UserPermissions&Perm)==Perm. Cependant, je veux être en mesure d'émettre un find_by_mask ou quelque chose de similaire, peut-être en utilisant un :conditions, mais je n'arrive pas à trouver comment je peux interroger la base de données pour récupérer une liste d'utilisateurs avec un masque de permission correspondant.Recherche par masque de bits dans ActiveRecord

Des idées utilisant ActiveRecord?

Plus précisément, cela doit fonctionner en utilisant SQLite et postgres

Répondre

12

La chose saine à faire, à mon avis, serait de sortir votre champ de bits dans une série de champs booléens. Stocker des masques de bits dans une base de données relationnelle n'est pas si loin de stocker des listes délimitées dans un champ - c'est une dénormalisation limite.

Cela dit, vous pouvez utiliser une opération de bits et dans vos requêtes SQL avec l'opérateur &, afin que vous puissiez dire:

User.where('permissions & ? > 0', Perm) 
+5

Merci pour l'info bitwise. J'ai pensé utiliser des booléens, mais j'ai 15 permissions, et je pourrais en ajouter plus tard. L'utilisation d'un masque de bits est beaucoup plus propre que d'avoir 15+ booléens dans la table. –

Questions connexes