public
Description: Adds support for declaring an ActiveRecord class as an enumeration
Homepage: http://www.pluginaweek.org
Clone URL: git://github.com/pluginaweek/enumerate_by.git
name age message
file .gitignore Fri Jul 04 15:49:48 -0700 2008 Ignore test/app_root/script [obrie]
file CHANGELOG.rdoc Loading commit data...
file LICENSE Sun May 04 14:35:16 -0700 2008 Move to trunk Add support for overriding the un... [obrie]
file README.rdoc Wed Jun 25 20:46:35 -0700 2008 Fix reference to other plugins' old resources [obrie]
file Rakefile
file init.rb Thu Jul 12 11:28:04 -0700 2007 Initial release [obrie]
directory lib/
directory test/
README.rdoc

acts_as_enumeration

acts_as_enumeration adds support for declaring an ActiveRecord class as an enumeration.

Resources

API

Bugs

Development

Source

  • git://github.com/pluginaweek/acts_as_enumeration.git

Description

Support for enumerations is dependent on the type of database you use. For example, MySQL has native support for the enum data type. However, there is no native Rails support for defining enumerations and the associations between it and other models in the application.

acts_as_enumeration adds support for enumerations in Rails by providing methods for interacting with records in a table as if they were values in an enumeration. The important thing to remember about this plugin is that you always use the enumeration attributes within the application and know that the enumeration ids are stored in the database. This means that you would use ‘red’ everywhere in your code when referencing the ‘red’ enumeration identifier, but it would always be stored in the database with the integer value of 1.

In addition, remember that your enumerations act almost exactly like regular ActiveRecord models. This means that you can define validations, enumerations, etc. There is limited support for advanced finder options, address by the acts_as_enumeration_in_memory plugin discussed later on.

Usage

Default enumeration

  class Color < ActiveRecord::Base
    acts_as_enumeration

    create :id => 1, :name => 'red'
    create :id => 2, :name => 'blue'
    create :id => 3, :name => 'green'
  end

Customized enumeration

  class Book < ActiveRecord::Base
    acts_as_enumeration :title

    create :id => 1, :title => 'Blink'
  end

Additional enumeration attributes

  class Book < ActiveRecord::Base
    acts_as_enumeration :title

    column :author, :string
    column :num_pages, :integer

    validates_presence_of :author
    validates_presence_of :num_pages

    create :id => 1, :title => 'Blink', :author => 'Malcolm Gladwell', :num_pages => 277
  end

Associations

  class ColorGroup < ActiveRecord::Base
    acts_as_enumeration

    has_many :colors, :foreign_key => 'group_id'

    create :id => 1, :name => 'RGB'
    create :id => 2, :name => 'CMYK'
  end

  class Color < ActiveRecord::Base
    acts_as_enumeration

    column :group_id, :integer

    belongs_to :group, :class_name => 'ColorGroup'
    has_many :cars
  end

  class Car < ActiveRecord::Base
    belongs_to :color
  end

Setting enumeration attributes

  class Color < ActiveRecord::Base
    acts_as_enumeration

    create :id => 1, :name => 'red'
    create :id => 2, :name => 'blue'
    create :id => 3, :name => 'green'
  end

  class Car < ActiveRecord::Base
    belongs_to :car
  end

  car = Car.create(:color => 'red')
  car.color = 'blue'

Future development

See acts_as_enumeration_in_memory for more information about the future development of this plugin in terms of ease of maintenance and utilization of ActiveRecord. acts_as_enumeration_in_memory is an experimental re-implementation of this plugin using an in-memory SQLite3 database.

Testing

Before you can run any tests, the following gem must be installed:

To run against a specific version of Rails:

  rake test RAILS_FRAMEWORK_ROOT=/path/to/rails

Dependencies

  • Rails 2.1 or later

References