README in coded_attribute-0.0.3 vs README in coded_attribute-0.0.4

- old
+ new

@@ -1,13 +1,89 @@ -CodedAttributes -=============== +=CodedAttribute -Introduction goes here. +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 + } -Example -======= + 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 -Example goes here. +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 -Copyright (c) 2010 [name of plugin creator], released under the MIT license +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 (c) 2010 Jaden Carver, released under the MIT license