Native ENUM types in ActiveRecord
Provides ActiveRecord (and thus Rails) support for the nonstandard
SET data types.
It sucks to have ActiveRecord not understand your
ENUM columns and constantly write the wrong thing to your
It also sucks to work with a database that uses
ENUM in production when you'd prefer sqlite in development.
Wait no longer...
create_table :balloons, :force => true do |t| t.enum "color", :limit => ['red', 'gold'], :default => 'gold', :null => false # or... t.column "size", :enum, :limit => ['small', 'medium', 'large'] end
Your schema<->db coupling will work again, and it will fall back to a
VARCHAR column on any adapters that don't support
Make sure to put this line after the line for your database adapter gem, like so:
gem 'mysql2', '~> 0.3.20' gem 'native_enum'
Hypothetically asked questions
Y U NO WORK?!
It currently works with:
- ActiveRecord 4.0, 4.1, 4.2, 5.0, and 5.1.
- Ruby 2.0 and above.
If you'd like to support other adapters, pull requests are welcome!
I thought Rails 4.1+ did enums?
This gem provides compatibility for native
ENUM types in the DB.
ActiveRecord::Enum is actually a layer that takes an integer column in the DB and presents it as an enum type.
These are fundamentally different approaches, with different motivations, costs and benefits.
Why doesn't it validate anything?
Following ActiveRecord's lead, this plugin doesn't do any validation work itself.
For ENUM columns, you may be satisfied with something simple:
validates_inclusion_of :attr, :in => [ :possible, :values ]
Or if you prefer more bells and whistles, try brainspec/enumerize.
For SET columns, you may be interested in iangreenleaf/active_set.
Nonstandard SQL?! What's your problem, jerkweed?
This isn't a plugin everyone should use. There are a number of plugins to simulate enum behavior backed by standard data types. Personally, I like nofxx/symbolize.
However, sometimes we can't or won't avoid working with these data types. When that happens, I got you covered.
Pull requests welcome! Join this lovely bunch of people.
Running the tests
To run the tests for all adapters and all versions of ActiveRecord:
appraisal rake spec:all
To run the tests for a specific adapter:
DB=mysql rake spec
To run the tests for a specific version of ActiveRecord:
appraisal activerecord-5.2 rake spec:all