Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Rails 3 support! Enables Active Record attributes to point to enum like objects, by saving in your database only an integer ID
Ruby
Branch: master
#1 Compare This branch is 10 commits ahead, 5 commits behind paraseba:master.

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
.gitignore
MIT-LICENSE
README.rdoc
Rakefile
enum_field.gemspec

README.rdoc

enum_field

DESCRIPTION:

Enables Active Record attributes to point to enum like objects, by saving in your database only an integer ID.

FEATURES:

  • Allows creation of Classes with enum like behaviour.

  • Allows any number of members and methods in the enum classes.

  • Allows an integer id to be used in your database columns to link to the enum members (user.role_id)

  • Enables higher abstraction interaction with AR attributes:

    • user.role = Role.admin

    • if user.role.can_edit?

  • Saves in your AR tables, only an integer id pointing to the enumeration member.

SYNOPSIS:

When in an Active Record class, you have an attribute like role, state or country you have several options.

  • You can create a roles, states or countries table, and dump there all possible values.

  • You can use a string to identify, for instance, the role.

  • You can use an id to identify the role.

If you are not confortable with any of this options, maybe enum_field is an answer for you.

BASIC USAGE:

class Role
  include EnumField::DefineEnum

  define_enum do |builder|
    builder.member :admin
    builder.member :manager
    builder.member :employee
  end
end

class User < ActiveRecord::Base
  extend EnumField::EnumeratedAttribute

  # in the database table there is a role_id integer column
  enumerated_attribute :role
end

link_to_if(current_user.role == Role.admin, edit_foo_path(@foo))

user.role = Role.manager
user.role_id == Role.manager.id  #will be true

User.first.role.id == User.first.role_id  #will be true

Your enum classes can have all the methods you need:

class PhoneType
  include EnumField::DefineEnum

  def initialize(name)
    @name = name
  end
  attr_reader :name

  define_enum do |b|
    b.member :home,       :object => new('home')
    b.member :commercial, :object => new('commercial')
    b.member :mobile,     :object => new('mobile')
  end
end

user.phone.type.name

You have some AR like methods in enum classes

PhoneType.all == [PhoneType.home, PhoneType.commercial, PhoneType.mobile]  # ordered all
PhoneType.first == PhoneType.home
PhoneType.last == PhoneType.mobile

PhoneType.find_by_id(PhoneType.home.id) == PhoneType.home
PhoneType.find_by_id(123456) == nil
PhoneType.find(2) == PhoneType.commercial
PhoneType.find(123456)  # will raise

PhoneType.find([1, 2]) == [PhoneType.home, PhoneType.commercial]

The library also mimics has_many :through behavior, for cases such as:

class Role
  include EnumField::DefineEnum

  define_enum do |builder|
    builder.member :admin
    builder.member :manager
    builder.member :employee
  end
end

class User
  extend EnumField::EnumeratedAttribute

  has_many_enumerated_attributes :roles, :through  => UserRole
end

class UserRole < ActiveRecord::Base
  extend EnumField::EnumeratedAttribute

  belongs_to :user
  enumerated_attribute :role
end

user = User.create
user.role = [Role.manager, Role.admin]
user.roles.include?(Role.admin)         #will be true
user.roles.include?(Role.manager)       #will be true
user.roles.include?(Role.employee)      #will be false
user.role_ids.include?(Role.manager.id) #will be true
user.role_ids = [Role.employee.id]
user.roles.include?(Role.employee)      #will be true
user.roles.include?(Role.admin)         #will be false

REQUIREMENTS:

  • activerecord

INSTALL:

gem 'galetahub-enum_field', :require => 'enum_field'

LICENSE:

(The MIT License)

Copyright © 2009 Sebastián Bernardo Galkin

Something went wrong with that request. Please try again.