Skip to content

store related attributes in a single integer field, similar to a flag byte

License

Notifications You must be signed in to change notification settings

grantr/has_enum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HasEnum
==================

HasEnum allows you to store a set of related attributes in a single integer field and
manipulate them as a hash.  It is intended to fix the common pattern of 

has_many :boolean_settings

but is not limited to boolean values.

Example
=======

The plugin was developed for user privacy settings.  A user may have multiple privacy
settings like email, last_name, birthday, interests, etc.  The value for each of these 
settings is either public, private, or friends.  A normal flag-byte wouldn't support the
tristate values, but HasEnum is flexible enough to handle any number of values (but keep 
in mind the maximum width of your integer field).

The syntax for the above example is:

has_enum :privacy_settings,
         :identifiers => [:public, :friends, :private]
         :attributes => [[:email, :private],
                         [:last_name, :friends],
                         [:birthday, :friends],
                         [:interests, :public]]

:identifiers is the list of possible values for an attribute. :attributes is an array of 
tuples where the first element is the name of the attribute and the second is the default 
value.

The default column name would be 'privacy_settings_map', but that can be changed with :column.

Now you can use privacy_settings like a hash:

user.privacy_settings[:email] 
# => :private
user.privacy_settings[:email] = :friends (but see limitations below)
# => :friends
user.privacy_settings[:email]
# => :friends

Limitations
===========
As you would expect from a flag byte, specification order is important.  Attribute
order and number/order of identifiers must remain the same.  Changing any of these 
will result in incorrect values from pre-existing maps.

Adding attributes is possible but they should only be added to the end of the list.
Future versions will include a method for converting from one representation to 
another.

Currently, it is not possible to set an attribute directly because composed_of requires
frozen objects.  This will hopefully be coming soon.

Copyright (c) 2008 Grant Rodgers, released under the MIT license

About

store related attributes in a single integer field, similar to a flag byte

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages