Enabled EAV behaviour on ActiveRecord (or is at least supposed to).
This was inspired by github.com/visfleet/acts_as_eav_model but is a more minimized approach and is less automated.
Stands for Entity-Attribute-Value and is a database design pattern to unload attributes from a table.
Entity-attribute-value model (EAV) is a data model to describe entities where the number of attributes (properties, parameters) that can be used to describe them is potentially vast, but the number that will actually apply to a given entity is relatively modest. In mathematics, this model is known as a *sparse matrix*. EAV is also known as object-attribute-value model and *open schema*.
Hartog de Mik (aka: coffeeaddict, coffeeaddict_nl)
gem install has_eav
In your model
class Post < ActiveRecord::Base has_many :tags belongs_to :user has_eav :through => :post_attribute do eav_attribute :author_name eav_attribute :author_age, Integer eav_attribute :author_email end end
Now, generate a model to hold the attributes
rails generate model PostAttribute post:references name:string value:string
And you are good to go.
Usage of EAV
For the general usage of EAV, thread wisely. Be careful and suspicious about your needs.
Usage of has_eav
Once you have setup +has_eav :through+ on your model, you can call the defined attributes as if they where present on your model. You should be able to treat your model as if the defined attributes where present in the database.
In contradiction to acts_as_eav_model, has_eav will not allow for an all open structure. You must define the attributes to be required.
has_eav works in an STI setting, and you can specify more attributes in the inheriting class. Since the root class is responsible for the relationship to the attributes class, you should not specify any options in the STI class
class PostponedPost < Post has_eav do eav_attribute :release_date end end
If you create a method instance_eav_attributes in your model, has_eav will recognize these attributes as well.
This might be useful for state machines or STI classes where you want to have different attributes based on the current state or type of the instance.
Make sure the EAV attributes make it into the serializable_hash
Make sure the nilified attributes are removed from the DB
Casting of dates and times added
Contributing to has_eav
Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
Fork the project
Start a feature/bugfix branch
Commit and push until you are happy with your contribution
Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
Create a nice generator
Put type casting on instance eav attributes
Copyright © 2010 Hartog C. de Mik. See LICENSE.txt for further details.