= has_eav == Description Enabled EAV behaviour on ActiveRecord (or is at least supposed to). This was inspired by https://github.com/visfleet/acts_as_eav_model but is a more minimized approach and is less automated. === EAV Stands for Entity-Attribute-Value and is a database design pattern to unload attributes from a table. From wikipedia: 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*. == Author [name] Hartog de Mik (aka: coffeeaddict, coffeeaddict_nl) [email] name.downcase.gsub(" ",".")@gmail.com [source] https://github.com/coffeeaddict/has_eav == Installation gem install has_eav == Setup 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 === 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. ==== Instance eav_attributes 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. == Changelog [1.1.1] * Make sure the EAV attributes make it into the serializable_hash * Make sure the nilified attributes are removed from the DB [1.1.0] * Casting of dates and times added [1.0.1] * STI works [1.0.0] * first release == 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. == TODO * Create a nice generator * Put type casting on instance eav attributes == Copyright Copyright (c) 2010 Hartog C. de Mik. See LICENSE.txt for further details.