It's not a blog post, it's a question!
Speaking about types I mean that we have type value and type description. We can have different types (gender, size, color and etc) and a collection of values for each type.
We have 2 choices: to keep types in database or in application.
For me to keep the whole table to store type values for each type is redundant. Another way is to store types in a single table with fields: type name, type value, type description.
To keep type in db useful if you would like to modify its values from application. But mostly when I add new type I am changing application behavior.
For me the better choice is to keep types in application. I have YML configuration file like this one (in fact it's a part of SettingsLogic settings file):
types:
gender: "male female"
Doing this way I can validate form inputs:
validates_inclusion_of :gender, :in => Settings.types.gender.split(/\s/)
As far as my application is multilingual I keep descriptions in localization files:
ru:
types:
gender:
male: "Мужской"
female: "Женский"
To prepare a collection of choices for select I use this helper method:
def genders
genders = []
Settings.types.gender.split(/\s/).each do |gender|
genders << [t("types.gender.#{gender}"), gender]
end
genders
end
The drawback of this approach is that I have to keep in db long type values male and female instead of sufficient m and f.
So I think about a hash now:
def genders
genders = []
gender_types = { :m => "male", :f => "female" }
gender_types.each do |key, value|
genders << [t("types.gender.#{value}"), key]
end
genders
end
But for now I have no answer where to keep hash like I do it with strings in configuration file. As I mentioned this hash should be accessible not only from helper method but in validations too.
So the question is wide enough: How do you keep types? What is the best or better approach?