Straight forward EAV behaviour for Rails3
Latest commit 4f5c08c Dec 4, 2013 @coffeeaddict Merge pull request #7 from hazah/refactor-method_missing
Refactor method missing




Enabled EAV behaviour on ActiveRecord (or is at least supposed to).

This was inspired by 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.

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*.



Hartog de Mik (aka: coffeeaddict, coffeeaddict_nl)


name.downcase.gsub(“ ”,“.”)



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

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

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.


  • 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

  • STI works

  • 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.


  • Create a nice generator

  • Put type casting on instance eav attributes


Copyright © 2010 Hartog C. de Mik. See LICENSE.txt for further details.