Enummer is a lightweight answer for adding enums with multiple values to Rails, with a similar syntax to Rails' built-in
Enummer officially supports Ruby versions 2.7, 3.0 and 3.1 with SQLite, PostgreSQL, and MariaDB.
gem "enummer" to your Gemfile and
Create a migration for an integer that looks something like this:
class CreateUsers < ActiveRecord::Migration[7.0] def change create_table :users do |t| t.integer :permissions, default: 0, null: false end end end
Now set up enummer with the available values in your model:
enummer permissions: %i[read write execute]
Scopes will now be provided for
User.read User.not_read User.write User.not_write User.execute User.not_execute
with_<name> scope will be generated which returns all records that match all given options. E.g.:
user1 = User.create!(permissions: %i[read write execute]) user2 = User.create!(permissions: %i[read write]) user3 = User.create!(permissions: %i[read]) # .where(permissions: ...) will generate an `IN` query, returning all records that have *any* # of those permissions. User.where(permissions: %i[read write]) # => [user1, user2, user3] # .with_permissions will return only users that have at least all of the given set of permissions User.with_permissions(%i[read write]) # => [user1, user2]
Simply calling the instance method for the column will return an array of options. Question mark methods are also provided.
user = User.last user.permissions # => [:read, :write] user.read? # => true user.write? # => true user.execute? # => false
Options can be set with an array of symbols or via bang methods. Bang methods will additionally persist the changes.
user.update(permissions: %i[read write]) user.write!
Which data type should I use?
That depends on how many options you expect to store. In PostgreSQL you should be able to store
bytes * 8 - 1 of your data type:
|numeric||???||all of them|
How can I use it outside of Rails?
Make an issue / PR and we'll see.
$ cd enummer $ bundle install $ cd test/dummy $ RAILS_ENV=test DATABASE_URL=sqlite3:dummy_test rails db:setup $ cd ../.. $ RAILS_ENV=test DATABASE_URL=sqlite3:dummy_test bin/test
- Lots of booleans
- DB Arrays
The gem is available as open source under the terms of the MIT License.