Native ENUM types in ActiveRecord

Provides ActiveRecord (and thus Rails) support for the nonstandard ENUM and SET data types.

Build Status

How now?

It sucks to have ActiveRecord not understand your ENUM columns and constantly write the wrong thing to your schema.rb. 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 ENUM.

Installation

gem 'native_enum'

Make sure to put this line after the line for your database adapter gem, like so:

gem 'mysql2', '~> 0.3.20'
gem 'native_enum'

That's it!

Hypothetically asked questions

Y U NO WORK?!

It currently works with:

  • ActiveRecord 4.0, 4.1, 4.2, 5.0, and 5.1.
  • The mysql2 and sqlite adapters.
  • 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.

Contributing

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