Add the has_many_polymorphs plugin
[cs356-p2-videostore.git] / vendor / plugins / has_many_polymorphs / README
diff --git a/vendor/plugins/has_many_polymorphs/README b/vendor/plugins/has_many_polymorphs/README
new file mode 100644 (file)
index 0000000..7413582
--- /dev/null
@@ -0,0 +1,174 @@
+
+Has_many_polymorphs
+
+An ActiveRecord plugin for self-referential and double-sided polymorphic associations.
+
+== License
+
+Copyright 2007 Cloudburst, LLC. Licensed under the AFL 3. See the included LICENSE file. 
+
+The public certificate for this gem is at http://rubyforge.org/frs/download.php/25331/evan_weaver-original-public_cert.pem.
+
+== Description
+
+This plugin lets you define self-referential and double-sided polymorphic associations in your models. It is an extension of <tt>has_many :through</tt>.
+
+“Polymorphic” means an association can freely point to any of several unrelated model classes, instead of being tied to one particular class.
+
+== Features
+
+* self-references
+* double-sided polymorphism
+* efficient database usage
+* STI support
+* namespace support
+* automatic individual and reverse associations
+
+The plugin also includes a generator for a tagging system, a common use case (see below).
+
+== Requirements
+
+* Rails 1.2.3 or greater
+
+= Usage
+
+== Installation
+
+To install the Rails plugin, run:
+  script/plugin install svn://rubyforge.org/var/svn/fauna/has_many_polymorphs/trunk
+
+There's also a gem version. To install it instead, run: 
+  sudo gem install has_many_polymorphs
+  
+If you are using the gem, make sure to add <tt>require 'has_many_polymorphs'</tt> to <tt>environment.rb</tt>, before Rails::Initializer block.
+
+== Configuration
+
+Setup the parent model as so:
+
+  class Kennel < ActiveRecord::Base
+    has_many_polymorphs :guests, :from => [:dogs, :cats, :birds]
+  end
+
+The join model:
+
+  class GuestsKennel < ActiveRecord::Base
+    belongs_to :kennel
+    belongs_to :guest, :polymorphic => true
+  end
+
+One of the child models:
+
+  class Dog < ActiveRecord::Base
+    # nothing
+  end
+
+See ActiveRecord::Associations::PolymorphicClassMethods for more configuration options.
+
+== Helper methods example
+
+  >> k = Kennel.find(1)
+  #<Kennel id: 1, name: "Happy Paws">
+  >> k.guests.map(&:class) 
+  [Dog, Cat, Cat, Bird]
+  
+  >> k.guests.push(Cat.create); k.cats.size
+  3
+  >> k.guests << Cat.create; k.cats.size
+  4
+  >> k.guests.size
+  6
+
+  >> d = k.dogs.first
+  #<Dog id: 3, name: "Rover">
+  >> d.kennels 
+  [#<Kennel id: 1, name: "Happy Paws">]
+  
+  >> k.guests.delete(d); k.dogs.size
+  0
+  >> k.guests.size
+  5  
+  
+Note that the parent method is always plural, even if there is only one parent (<tt>Dog#kennels</tt>, not <tt>Dog#kennel</tt>).
+
+See ActiveRecord::Associations::PolymorphicAssociation for more helper method details.
+
+= Extras
+
+== Double-sided polymorphism
+
+Double-sided relationships are defined on the join model:
+
+  class Devouring < ActiveRecord::Base
+    belongs_to :guest, :polymorphic => true
+    belongs_to :eaten, :polymorphic => true
+  
+    acts_as_double_polymorphic_join(
+      :guests =>[:dogs, :cats], 
+      :eatens => [:cats, :birds]
+    )       
+  end
+  
+Now, dogs and cats can eat birds and cats. Birds can't eat anything (they aren't <tt>guests</tt>) and dogs can't be eaten by anything (since they aren't <tt>eatens</tt>). The keys stand for what the models are, not what they do. 
+
+In this case, each guest/eaten relationship is called a Devouring.
+
+See ActiveRecord::Associations::PolymorphicClassMethods for more.
+
+== Tagging generator
+
+Has_many_polymorphs includes a tagging system generator. Run:
+  script/generate tagging Dog Cat [...MoreModels...]
+
+This adds a migration and new Tag and Tagging models in <tt>app/models</tt>. It configures Tag with an appropriate <tt>has_many_polymorphs</tt> call against the models you list at the command line. It also adds the file <tt>lib/tagging_extensions.rb</tt> and <tt>requires</tt> it in <tt>environment.rb</tt>. 
+
+Tests will also be generated. 
+
+Once you've run the generator, you can tag records as follows:
+
+  >> d = Dog.create(:name => "Rover")
+  #<Dog id: 3, name: "Rover">
+  >> d.tag_list
+  ""
+  >> d.tag_with "fierce loud"
+  #<Dog id: 3, name: "Rover">
+  >> d.tag_list
+  "fierce loud"
+  >> c = Cat.create(:name => "Chloe")
+  #<Cat id: 1, name: "Chloe">
+  >> c.tag_with "fierce cute"
+  #<Cat id: 1, name: "Chloe">
+  >> c.tag_list
+  "cute fierce"
+  >> Tag.find_by_name("fierce").taggables 
+  [#<Cat id: 1, name: "Chloe">, #<Dog id: 3, name: "Rover">]
+
+The generator accepts the optional flag <tt>--skip-migration</tt> to skip generating a migration (for example, if you are converting from <tt>acts_as_taggable</tt>). It also accepts the flag <tt>--self-referential</tt> if you want to be able to tag tags.
+
+See ActiveRecord::Base::TaggingExtensions, Tag, and Tagging for more.
+
+== Troubleshooting
+
+Some debugging tools are available in <tt>lib/has_many_polymorphs/debugging_tools.rb</tt>.
+
+If you are having trouble, think very carefully about how your model classes, key columns, and table names relate. You may have to explicitly specify options on your join model such as <tt>:class_name</tt>, <tt>:foreign_key</tt>, or <tt>:as</tt>. The included tests are a good place to look for examples.
+
+Note that because of the way Rails reloads model classes, the plugin can sometimes bog down your development server. Set <tt>config.cache_classes = true</tt> in <tt>config/environments/development.rb</tt> to avoid this. 
+
+== Reporting problems
+
+* http://rubyforge.org/forum/forum.php?forum_id=16450
+
+Patches and contributions are very welcome. Please note that contributors are required to assign copyright for their additions to Cloudburst, LLC.
+
+== Further resources
+
+* http://blog.evanweaver.com/articles/2007/08/15/polymorphs-tutorial
+* http://blog.evanweaver.com/articles/2007/02/22/polymorphs-25-total-insanity-branch
+* http://blog.evanweaver.com/articles/2007/02/09/how-to-find-the-most-popular-tags
+* http://blog.evanweaver.com/articles/2007/01/13/growing-up-your-acts_as_taggable
+* http://blog.evanweaver.com/articles/2006/12/02/polymorphs-19
+* http://blog.evanweaver.com/articles/2006/11/05/directed-double-polymorphic-associations
+* http://blog.evanweaver.com/articles/2006/11/04/namespaced-model-support-in-has_many_polymorphs
+* http://blog.evanweaver.com/articles/2006/09/26/sti-support-in-has_many_polymorphs
+* http://blog.evanweaver.com/articles/2006/09/11/make-polymorphic-children-belong-to-only-one-parent