BitwiseAttribute
Manipulation of bitmask attributes in your classes (typically ActiveRecord models). You can have multiple values mapped to the same column — for example when you need a User with multiple roles.
It adds a lot of helper methods so you don't have to deal with the underlying mask.
Installation
Add this line to your application's Gemfile:
gem 'bitwise_attribute'
And then execute:
$ bundle
Or install it yourself as:
$ gem install bitwise_attribute
Usage
Include BitwiseAttribute
and then define your attribute with attr_bitwise
. By default it will
use the singularized name with _mask
.
Check the example below to see how to use the helpers and methods created automatically in your classes.
Examples
For the roles
attribute you need to have role_mask
column in your model, so add the migration:
class AddRoleMaskToUsers < ActiveRecord::Migration
def change
add_column :users, :role_mask, :integer, default: 0
end
end
class User < ActiveRecord::Base
include BitwiseAttribute
# This line will do all the magic!
#
# By default we assume that your column will be called `role_mask`.
# You can send the `column_name` option if your column has another name.
#
attr_bitwise :roles, values: %i[user moderator admin]
end
Instance manipulation
You can then access the roles
field without having to know the underlying value of role_mask
.
user = User.new(roles: [:user, :admin])
user.roles
#=> [:user, :admin]
user.role_mask
#=> 5
user.roles << :moderator
user.roles
#=> [:user, :admin, :moderator]
You can see if a particular record has a given value:
user.admin?
#=> true
Class methods
You can get all available values and correspondent mask value:
User.roles
#=> { :user => 1, :moderator => 2, :admin => 4 }
So if you need all the keys just use:
User.roles.keys
#=> [:user, :moderator, :admin]
ActiveRecord named scopes
BitwiseAttribte will add some methods for easier queries on the database:
User.with_roles
#=> Users that have at least one role
User.with_roles(:admin)
#=> Users that have the :admin role
User.with_roles(:admin, :moderator)
#=> Users that have the admin role AND the moderator role
User.with_any_roles(:admin, :moderator)
#=> Users that have the admin role OR the moderator role
User.with_exact_roles(:moderator)
#=> Users that have ONLY the moderator role
User.with_exact_roles(:moderator, :admin)
#=> Users that have ONLY the moderator AND admin roles
User.without_roles(:admin)
#=> Users without the admin role
User.without_roles(:admin, :moderator)
#=> Users without the admin role AND without the moderator role
These are the same as using with_roles
:
User.admin
User.user
User.admin.moderator
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run
the tests. You can also run bin/console
for an interactive prompt that will allow you to
experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new
version, update the version number in version.rb
, and then run bundle exec rake release
, which
will create a git tag for the version, push git commits and tags, and push the .gem
file
to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/rikas/bitwise_attribute.
License
The gem is available as open source under the terms of the MIT License.