2010-08-02 19 views
5

Tengo una tabla de usuarios con un campo de máscara de bits que tiene una máscara de permisos. Localmente, puedo determinar si un usuario tiene cierto permiso al hacer una máscara de bits (UserPermissions&Perm)==Perm. Sin embargo, deseo poder emitir un find_by_mask o algo similar, tal vez usando un :conditions, pero parece que no puedo averiguar cómo puedo consultar la base de datos para recuperar una lista de usuarios con una máscara de permisos coincidente.Búsqueda por máscara de bits en ActiveRecord

¿Alguna idea de usar ActiveRecord?

Específicamente esto debe trabajar utilizando SQLite y PostgreSQL

Respuesta

12

La cosa sensata que hacer, en mi opinión, sería romper con su campo de máscara de bits en una serie de campos booleanos. Almacenar máscaras de bits en una base de datos relacional no está tan lejos de almacenar listas delimitadas en un campo, es la desnormalización en el límite.

Dicho esto, se puede utilizar un AND bit a bit en las consultas SQL con el operador &, por lo que se puede decir:

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

Gracias por la información bit a bit. Pensé en usar booleanos, pero tengo unos 15 permisos y podría agregar más más tarde. Usar una máscara de bits es mucho más limpio que tener más de 15 booleanos en la tabla. –

Cuestiones relacionadas