This mixin adds a has many polymorphic relationship to a model and creates all the relationships needed by rails to handle it.
You must define the models that you want to use inside an initializer using
- name of the relationship, there is a convention that whatever name you choose, the polymorphic table columns on your through table should match.
- through - the model that handles the through relationship
- models - models that should be included in this polymophic relationship
- the name of your relationship is used for the method name of this method. it will return an array of the models that are related via the has_many relationships
There is an after_save call back that will save the relationships when they are added or removed. If you want to remove a relationship the models need to be destroyed and this model reloaded.
create_table :zoos, :force => true do |t| t.string :name end create_table :monkeys, :force => true do |t| t.string :name end create_table :bears, :force => true do |t| t.string :name end create_table :birds, :force => true do |t| t.string :name end create_table :zoo_animals, :force => true do |t| t.integer :zoo_id t.references :animal, :polymorphic => true end
class Zoo < ActiveRecord::Base has_many_polymorphic :animals, :through => :zoo_animals, :models => [:monkeys, :birds, :bears] end
What you get
zoo = Zoo.first zoo.monkeys zoo.birds zoo.bears
zoo = Zoo.first zoo.animals
which is a concatentated array of the models. You also get the following
monkey = Monkey.first monkey.zoos bird = Bird.first bird.zoos bear = Bear.first bear.zoos