Apologies if the question is a little imprecise, but I’ll describe my problem below.
I’m setting up some models in a Rails project, and one thing I’ve noticed I’m running into more than a few times is dealing with attributes that meet the following criteria:
- They can be set to one of a small, predefined set of values
- Those values need to have both a name and an identifier (whether a numeric id, code, whatever)
- The values would only ever change as the result of a good deal of code change.
For example, one of my models should have a status field that can be set to one of: Defining, Executed, or Completed. I need to show those specific words within the interface, but I don’t want to store the strings in the DB in case I need to change them in the future (or internationalize, or whatever.)
The obvious option is to define models for each of these models, but that seems to present a good deal of overhead in maintaining the models, ensuring that I write migrations between environments, etc. for each one of these, which seems like a lot of overhead.
The other option is to store it as an integer, and whip up an “enumeration” type class that stores the translation of those values – this would probably work fine, but I’m concerned that I’ll lose associations and other handy stuff I get from ActiveRecord models.
Any advice on the best way to handle this situation?
Check out the ruby gem I’ve been working on called classy_enum. I’m pretty sure it does exactly what you’re looking for. The README has some example usage, but the premise is that it lets you define multiple enum members as classes that can have different properties.