- mapping constant value and keyword
- class knows the mapping
- instance knows its attribute value's keyword from the mapping
Add this line to your application's Gemfile:
gem 'enumattr'
And then execute:
$ bundle
Or install it yourself as:
$ gem install enumattr
include Enumattr::Base- declare
enumattr :attr_name do ... end enum :keyword, valueindo ... endblock
example:
class User
include Enumattr::Base
attr_accessor :status
enumattr :status do
enum :active, 1
enum :inactive, 2
enum :deleted, 3
end
def initialize(status)
@status = status
end
end
then defining class methods and instance methods.
- class methods
User.status_keysas{attr_name}_keysreturn keyword arrayUser.status_valuesas{attr_name}_valuesreturn value arrayUser.status_enumsas{attr_name}_enumsreturn Enum object arrayUser.status_enum(:active)as{attr_name}_enum(:keyword)return an Enum objectUser.status_value(:active)as{attr_name}_value(:keyword)return a value
- instance methods
User#status_keyas{attr_name}_keyreturn a keyword correspond to mappingUser#status_enumas{attr_name}_enumreturn a Enum object correspond to mappingUser#status_valueas{attr_name}_valuereturn a value (alias status_value status)User#status_key = :inactiveas{attr_name}_key=setter by keywordUser#status_active?as{attr_name}_{keyword}?query method return true or false
Enum object (Enumattr::Enums::Enum) has key and value attributes
example:
User.status_keys
#=> [:active, :inactive, :deleted]
User.status_values
#=> [1, 2, 3]
User.status_enums
#=> [#<Enumattr::Enums::Enum:0x9459d00, @key=:active, @value=1, @extras=[]>, #<Enumattr::Enums::Enum:0x9459c88, @key=:inactive, @value=2, @extras=[]>, #<Enumattr::Enums::Enum:0x9459be8, @key=:deleted, @value=3, @extras=[]>]
enum = User.status_enum(:active)
#=> #<Enumattr::Enums::Enum:0x007ff58b220618 @container=#<Enumattr::Enums:0x007ff58b2207a8>, @key=:active, @value=1, @extras=[]>
# Enum object has key and value attributes
enum.key
#=> :active
enum.value
#=> 1
User.status_enum(:dummy)
#=> nil
User.status_value(:active)
#=> 1
User.status_value(:dummy)
#=> nil
user = User.new(1)
#=> #<User:0x007ff58b050dd8 @status=1>
user.status
#=> 1
user.status_key
#=> :active
user.status_value
#=> 1
user.status_key = :inactive
#=> :inactive
user.status
#=> 2
user.status_active?
#=> false
user.status_inactive?
#=> true
:on- specify existent attribute or method if
enumattr_nameattribute or method doesn't exist enumattr :enumattr_name, :on => :existent_attribute do ...
- specify existent attribute or method if
:enums- altenative enum defining leteral by hash instead of block
enumattr :enumattr_name, :enums => {:keyword1 => value1, :keyword2 => value2}enumattr :enumattr_name, :enums => [[:keyword1, value1], [:keyword2, value2]](Ruby 1.8.7 and need ordered)
:extend- enum object extension
enumattr :enumattr_name, :extend => Extension do ...
see: examples/*.rb and spec/enumattr/*.rb
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Added some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request