Take the 2-minute tour ×

I'm doing a fairly complicated model on Ruby on Rails right now, and I was wondering what the correct "Rails" way of doing "custom types" for attributes was. For example, I have a table businesses which has a string attribute region. But region can only be one of a predefined list of possibilities (that could later be expanded). My question is: where do I define this Region type?

I know I could make a specific regions table (i.e. a Region model) which could house all the options, and then I could make an association between the models that have regions to that table. The problem is that I have many of these types on my model, so I would end up with more than half the tables in my database being "custom type tables" that only store the possible values for these types. Is that practical?

I also read that you could do this through validations (i.e. validate when saving a record, that the variables were within the possible values). This seems very impractical, since I want to make this model expandable, and form views would need to load the possible values of types into select boxes, etc. If I used this method, every time I needed to add a new possible value for a type, I'd have to change the validation and the views.

Is there a standard way of doing something like this? Something like defining types (maybe models without DB backing?) where I could list all the possible values easily?

Thank you for any help or suggestions on this. It's been bothering me for a long time while doing RoR apps, and I'm tired of hacking around it.

share|improve this question
add comment

1 Answer

up vote 1 down vote accepted

I guess there are many different ways to do it. Personally I would keep things very simple and DRY.

In an initializer, set arrays in the global scope:

REGIONS = ["region A", "region B", "region C"]

In the models, use validations as you wrote. Check that the value is in the REGIONS array.

In the views, use Rails helpers to populate selects, radios etc. from the REGIONS array. If you always have the same select, write your own helper region_select for instance.

share|improve this answer
This seems like a great solution for what I'm trying to do. Thank you very much! I will still make some custom type tables/models for the custom types that are expanded by the app at runtime, but the rest of the custom types can be perfectly defined with this method. –  VotaVader Mar 22 '12 at 16:18
add comment

Your Answer


