0.0
No commit activity in last 3 years
No release in over 3 years
ActiveRecord plugin for storing coded variables
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 3.0.0

Runtime

>= 3.0.0
 Project Readme

CodedAttribute¶ ↑

Two of my favorite MySQL datatypes are ENUMs and SETs. Unfortunately, ActiveRecord doesn’t appear to support these fields well, or provide a good and simple alternative to the problem of coded values. In the past, I used to write getters and setters that looked something like this to solve my problem.

class Article
  STATUS_CODES => {
      :deleted => 0, 0 => :deleted
      :pending => 1, 1 => :pending,
    :completed => 2, 2 => :completed,
    :published => 3, 3 => :published
  }

  def status=(value)
    value = value.to_sym if value.is_a?(String)
    status_code = STATUS_CODES[value]
  end

  def status
    STATUS_CODES[status_code]
  end
end

Doesn’t that code look horrible? Wouldn’t it be better if it looked like this?!

class Article
  coded_attribute :status {
    0 => :deleted
    1 => :pending
    2 => :completed
    3 => :published
  end
end

Or, if we want to get even lazier!

class MyClass
  coded_attribute :status, [ :deleted, :active, :pending, :deleted ]
end

If so, then you’ve come to the right place.

This plugin makes doing all of the above super easy. And your code (and other programmers) will love you for using it! Like seriously love you!

Coded Attributes¶ ↑

Lets get down to it. Suppose we have a car, and it can be any one of a variety of colors. We can indicate this in the model with the following code:

class Car < ActiveRecord::Base
  coded_attribute :color, [ :red, :orange, :yellow, :green, :blue, :indigo, :violet ]
end

But we aren’t finished just yet. We still need to create a column to store our attribute data in. There are two ways to go about this.

Storing the Coded Value¶ ↑

The easiest way to store the coded value is to create an integer column in the database by appending ‘_code’ to the name of the attribute. So in our ‘cars’ table, we could create a ‘color_code’ integer field. If you do not want to name the column in your database ‘color_code’, you can replace :color, with a :method => :column pair, for example:

class Car < ActiveRecord::Base
  coded_attribute :color => :color_id, [ :red, orange, :yellow, :green, :blue, :indigo, :violet ]
end

Coded Attribute Sets¶ ↑

If you do not want to use a SET datatype, coded_attribute_set an make use of an integer bitmask to store the values.

class Car < ActiveRecord::Base
  coded_attribute_set :color, [ :red, :orange, :yellow, :green, :blue, :indigo, :violet ]
end

Planned Features¶ ↑

Future versions should hopefully support auto-detecting and setup of enum and set types (so you don’t need to even define the coded_attribute, it will be done automatically on all classes).

I also plan on a method added to Migrations that allow you to easily recode data

Copyright © 2010 Jaden Carver, released under the MIT license