You know how some bug trackers (and other software) allow you to add custom fields?
Typically this is done with a data structure that looks something like this:
Something like...?
class Item < ActiveRecord::Base
has_many :field_values
has_many :field_definitions, :through => :field_values
def custom_fields_hash
cfh = {}
self.field_values.each |fv|
cfh[fv.field_definition] = fv
end
cfh
end
end
class FieldValue < ActiveRecord::Base
belongs_to :item
belongs_to :field_definition
end
class FieldDefinition < ActiveRecord::Base
has_many :field_values
has_many :items, :through => field_values
end
Or, you could change
cfh[fv.field_definition] = fv
...to...
cfh[fv.field_definition.field_name] = fv.value
If your intention is to have your FieldDefinition
records belonging to different models (for example, a column item_id
that points to either a SqueekyToyItem
or a BalloonItem
) then what you want is a polymorphic association.
It basically allows you to have an item_type
column (beside your item_id
column), which then specifies the actual type of item it points to.
There's a heading “Polymorphic associations” in the documentation for ActiveRecord::Associations::ClassMethods.
Take a look at the Friendly ORM. It allows you to work with mysql without a schema. It was inspired by this blog post about how Friendfeed uses mysql to store schemaless data.
Friendly would replace ActiveRecord, although you can use ActiveRecord models next to Friendly models pretty easily.