Sometimes we need to store several booleans to determine a user's settings.Bitmask is a good solution for that.Bitmask use a single integer where each bit represents one such boolean.
For example user has many roles.One solution would be create a text column called roles in roles table and make a one to many relationship between users and roles table.This approach works fine but if we want users to assign many roles without any roles table then we use Bitmask
Using bitmask we can store multiple values in a single integer column and we can retrieve users by their roles.
To use Bitmask attributes in Rails application first we need to install below ruby gem
gem 'bitmask_attributes'
Now we have an integer column roles in users table. In User model we define a bitmask with its possible values.
class User < ActiveRecord::Base
bitmask :roles, :as => [:admin, :superadmin, :tester], :zero_value => :none
end
You can then modify the column using the declared values without resorting to manual bitmasks.
user = User.create(:name => "Bruce", :roles => [:superadmin, :tester]), :zero_value => :none
user.roles
# => [:superadmin, :tester]
To find ou a record with a given value:
user.roles?(:admin)
# => true
To get the list of all values for any given attribute:
User.values_for_roles
# => [:admin, :superadmin, :tester]
Some named scopes are also generated with `bitmask`:
User.with_roles
User.with_roles(:tester)
User.with_roles(:superadmin, :tester)
User.with_any_roles(:superadmin, :tester)
User.with_exact_roles(:tester)
User.with_exact_roles(:admin, :tester)
0 Comment(s)