<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -19,13 +19,13 @@ module ActiveRecord
       super(&quot;Cannot have a has_many :through association '#{owner_class_name}##{reflection.name}' on the polymorphic object '#{source_reflection.class_name}##{source_reflection.name}'.&quot;)
     end
   end
-  
+
   class HasManyThroughAssociationPointlessSourceTypeError &lt; ActiveRecordError #:nodoc:
     def initialize(owner_class_name, reflection, source_reflection)
       super(&quot;Cannot have a has_many :through association '#{owner_class_name}##{reflection.name}' with a :source_type option if the '#{reflection.through_reflection.class_name}##{source_reflection.name}' is not polymorphic.  Try removing :source_type on your association.&quot;)
     end
   end
-  
+
   class HasManyThroughSourceAssociationNotFoundError &lt; ActiveRecordError #:nodoc:
     def initialize(reflection)
       through_reflection      = reflection.through_reflection
@@ -72,21 +72,21 @@ module ActiveRecord
       base.extend(ClassMethods)
     end
 
-    # Clears out the association cache 
+    # Clears out the association cache
     def clear_association_cache #:nodoc:
       self.class.reflect_on_all_associations.to_a.each do |assoc|
         instance_variable_set &quot;@#{assoc.name}&quot;, nil
       end unless self.new_record?
     end
-    
-    # Associations are a set of macro-like class methods for tying objects together through foreign keys. They express relationships like 
-    # &quot;Project has one Project Manager&quot; or &quot;Project belongs to a Portfolio&quot;. Each macro adds a number of methods to the class which are 
-    # specialized according to the collection or association symbol and the options hash. It works much the same way as Ruby's own &lt;tt&gt;attr*&lt;/tt&gt; 
+
+    # Associations are a set of macro-like class methods for tying objects together through foreign keys. They express relationships like
+    # &quot;Project has one Project Manager&quot; or &quot;Project belongs to a Portfolio&quot;. Each macro adds a number of methods to the class which are
+    # specialized according to the collection or association symbol and the options hash. It works much the same way as Ruby's own &lt;tt&gt;attr*&lt;/tt&gt;
     # methods. Example:
     #
     #   class Project &lt; ActiveRecord::Base
     #     belongs_to              :portfolio
-    #     has_one                 :project_manager 
+    #     has_one                 :project_manager
     #     has_many                :milestones
     #     has_and_belongs_to_many :categories
     #   end
@@ -117,38 +117,38 @@ module ActiveRecord
     #   #build_other(attributes={})       |     X      |              |    X
     #   #create_other(attributes={})      |     X      |              |    X
     #   #other.create!(attributes={})     |            |              |    X
-    #   #other.nil?                       |     X      |      X       |    
+    #   #other.nil?                       |     X      |      X       |
     #
     # ===Collection associations (one-to-many / many-to-many)
     #                                     |       |          | has_many
-    #   generated methods                 | habtm | has_many | :through  
+    #   generated methods                 | habtm | has_many | :through
     #   ----------------------------------+-------+----------+----------
     #   #others                           |   X   |    X     |    X
-    #   #others=(other,other,...)         |   X   |    X     |    
+    #   #others=(other,other,...)         |   X   |    X     |
     #   #other_ids                        |   X   |    X     |    X
-    #   #other_ids=(id,id,...)            |   X   |    X     |    
+    #   #other_ids=(id,id,...)            |   X   |    X     |
     #   #others&lt;&lt;                         |   X   |    X     |    X
     #   #others.push                      |   X   |    X     |    X
     #   #others.concat                    |   X   |    X     |    X
     #   #others.build(attributes={})      |   X   |    X     |    X
-    #   #others.create(attributes={})     |   X   |    X     |    
+    #   #others.create(attributes={})     |   X   |    X     |
     #   #others.create!(attributes={})    |   X   |    X     |    X
     #   #others.size                      |   X   |    X     |    X
     #   #others.length                    |   X   |    X     |    X
     #   #others.count                     |       |    X     |    X
     #   #others.sum(args*,&amp;block)         |   X   |    X     |    X
     #   #others.empty?                    |   X   |    X     |    X
-    #   #others.clear                     |   X   |    X     |    
+    #   #others.clear                     |   X   |    X     |
     #   #others.delete(other,other,...)   |   X   |    X     |    X
-    #   #others.delete_all                |   X   |    X     |    
+    #   #others.delete_all                |   X   |    X     |
     #   #others.destroy_all               |   X   |    X     |    X
     #   #others.find(*args)               |   X   |    X     |    X
-    #   #others.find_first                |   X   |          |    
-    #   #others.uniq                      |   X   |    X     |    
+    #   #others.find_first                |   X   |          |
+    #   #others.uniq                      |   X   |    X     |
     #   #others.reset                     |   X   |    X     |    X
     #
     # == Cardinality and associations
-    # 
+    #
     # ActiveRecord associations can be used to describe relations with one-to-one, one-to-many
     # and many-to-many cardinality. Each model uses an association to describe its role in
     # the relation. In each case, the +belongs_to+ association is used in the model that has
@@ -207,7 +207,7 @@ module ActiveRecord
     #   end
     #
     # Choosing which way to build a many-to-many relationship is not always simple.
-    # If you need to work with the relationship model as its own entity, 
+    # If you need to work with the relationship model as its own entity,
     # use &lt;tt&gt;has_many :through&lt;/tt&gt;. Use +has_and_belongs_to_many+ when working with legacy schemas or when
     # you never work directly with the relationship itself.
     #
@@ -253,7 +253,7 @@ module ActiveRecord
     # * If either of these saves fail (due to one of the objects being invalid) the assignment statement returns +false+ and the assignment
     #   is cancelled.
     # * If you wish to assign an object to a +has_one+ association without saving it, use the &lt;tt&gt;#association.build&lt;/tt&gt; method (documented below).
-    # * Assigning an object to a +belongs_to+ association does not save the object, since the foreign key field belongs on the parent. It 
+    # * Assigning an object to a +belongs_to+ association does not save the object, since the foreign key field belongs on the parent. It
     #   does not save the parent either.
     #
     # === Collections
@@ -275,10 +275,10 @@ module ActiveRecord
     #     def evaluate_velocity(developer)
     #       ...
     #     end
-    #   end 
+    #   end
     #
     # It's possible to stack callbacks by passing them as an array. Example:
-    # 
+    #
     #   class Project
     #     has_and_belongs_to_many :developers, :after_add =&gt; [:evaluate_velocity, Proc.new { |p, d| p.shipping_date = Time.now}]
     #   end
@@ -334,43 +334,43 @@ module ActiveRecord
     #
     # Some extensions can only be made to work with knowledge of the association proxy's internals.
     # Extensions can access relevant state using accessors on the association proxy:
-    # 
+    #
     # * +proxy_owner+ - Returns the object the association is part of.
     # * +proxy_reflection+ - Returns the reflection object that describes the association.
     # * +proxy_target+ - Returns the associated object for +belongs_to+ and +has_one+, or the collection of associated objects for +has_many+ and +has_and_belongs_to_many+.
     #
     # === Association Join Models
-    # 
+    #
     # Has Many associations can be configured with the &lt;tt&gt;:through&lt;/tt&gt; option to use an explicit join model to retrieve the data.  This
     # operates similarly to a +has_and_belongs_to_many+ association.  The advantage is that you're able to add validations,
     # callbacks, and extra attributes on the join model.  Consider the following schema:
-    # 
+    #
     #   class Author &lt; ActiveRecord::Base
     #     has_many :authorships
     #     has_many :books, :through =&gt; :authorships
     #   end
-    # 
+    #
     #   class Authorship &lt; ActiveRecord::Base
     #     belongs_to :author
     #     belongs_to :book
     #   end
-    # 
+    #
     #   @author = Author.find :first
     #   @author.authorships.collect { |a| a.book } # selects all books that the author's authorships belong to.
     #   @author.books                              # selects all books by using the Authorship join model
-    # 
+    #
     # You can also go through a +has_many+ association on the join model:
-    # 
+    #
     #   class Firm &lt; ActiveRecord::Base
     #     has_many   :clients
     #     has_many   :invoices, :through =&gt; :clients
     #   end
-    #   
+    #
     #   class Client &lt; ActiveRecord::Base
     #     belongs_to :firm
     #     has_many   :invoices
     #   end
-    #   
+    #
     #   class Invoice &lt; ActiveRecord::Base
     #     belongs_to :client
     #   end
@@ -380,36 +380,36 @@ module ActiveRecord
     #   @firm.invoices                                   # selects all invoices by going through the Client join model.
     #
     # === Polymorphic Associations
-    # 
-    # Polymorphic associations on models are not restricted on what types of models they can be associated with.  Rather, they 
+    #
+    # Polymorphic associations on models are not restricted on what types of models they can be associated with.  Rather, they
     # specify an interface that a +has_many+ association must adhere to.
-    # 
+    #
     #   class Asset &lt; ActiveRecord::Base
     #     belongs_to :attachable, :polymorphic =&gt; true
     #   end
-    # 
+    #
     #   class Post &lt; ActiveRecord::Base
     #     has_many :assets, :as =&gt; :attachable         # The :as option specifies the polymorphic interface to use.
     #   end
     #
     #   @asset.attachable = @post
-    # 
+    #
     # This works by using a type column in addition to a foreign key to specify the associated record.  In the Asset example, you'd need
     # an +attachable_id+ integer column and an +attachable_type+ string column.
     #
     # Using polymorphic associations in combination with single table inheritance (STI) is a little tricky. In order
-    # for the associations to work as expected, ensure that you store the base model for the STI models in the 
+    # for the associations to work as expected, ensure that you store the base model for the STI models in the
     # type column of the polymorphic association. To continue with the asset example above, suppose there are guest posts
     # and member posts that use the posts table for STI. In this case, there must be a +type+ column in the posts table.
     #
     #   class Asset &lt; ActiveRecord::Base
     #     belongs_to :attachable, :polymorphic =&gt; true
-    #     
+    #
     #     def attachable_type=(sType)
     #        super(sType.to_s.classify.constantize.base_class.to_s)
     #     end
     #   end
-    # 
+    #
     #   class Post &lt; ActiveRecord::Base
     #     # because we store &quot;Post&quot; in attachable_type now :dependent =&gt; :destroy will work
     #     has_many :assets, :as =&gt; :attachable, :dependent =&gt; :destroy
@@ -424,7 +424,7 @@ module ActiveRecord
     # == Caching
     #
     # All of the methods are built on a simple caching principle that will keep the result of the last query around unless specifically
-    # instructed not to. The cache is even shared across methods to make it even cheaper to use the macro-added methods without 
+    # instructed not to. The cache is even shared across methods to make it even cheaper to use the macro-added methods without
     # worrying too much about performance at the first go. Example:
     #
     #   project.milestones             # fetches milestones from the database
@@ -450,7 +450,7 @@ module ActiveRecord
     #     puts &quot;Post:            &quot; + post.title
     #     puts &quot;Written by:      &quot; + post.author.name
     #     puts &quot;Last comment on: &quot; + post.comments.first.created_on
-    #   end 
+    #   end
     #
     # To iterate over these one hundred posts, we'll generate 201 database queries. Let's first just optimize it for retrieving the author:
     #
@@ -475,7 +475,7 @@ module ActiveRecord
     # All of this power shouldn't fool you into thinking that you can pull out huge amounts of data with no performance penalty just because you've reduced
     # the number of queries. The database still needs to send all the data to Active Record and it still needs to be processed. So it's no
     # catch-all for performance problems, but it's a great way to cut down on the number of queries in a situation as the one described above.
-    # 
+    #
     # Since the eager loading pulls from multiple tables, you'll have to disambiguate any column references in both conditions and orders. So
     # &lt;tt&gt;:order =&gt; &quot;posts.id DESC&quot;&lt;/tt&gt; will work while &lt;tt&gt;:order =&gt; &quot;id DESC&quot;&lt;/tt&gt; will not. Because eager loading generates the +SELECT+ statement too, the
     # &lt;tt&gt;:select&lt;/tt&gt; option is ignored.
@@ -483,37 +483,37 @@ module ActiveRecord
     # You can use eager loading on multiple associations from the same table, but you cannot use those associations in orders and conditions
     # as there is currently not any way to disambiguate them. Eager loading will not pull additional attributes on join tables, so &quot;rich
     # associations&quot; with +has_and_belongs_to_many+ are not a good fit for eager loading.
-    # 
+    #
     # When eager loaded, conditions are interpolated in the context of the model class, not the model instance.  Conditions are lazily interpolated
     # before the actual model exists.
-    # 
+    #
     # == Table Aliasing
     #
     # ActiveRecord uses table aliasing in the case that a table is referenced multiple times in a join.  If a table is referenced only once,
     # the standard table name is used.  The second time, the table is aliased as &lt;tt&gt;#{reflection_name}_#{parent_table_name}&lt;/tt&gt;.  Indexes are appended
     # for any more successive uses of the table name.
-    # 
+    #
     #   Post.find :all, :include =&gt; :comments
     #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN comments ON ...
     #   Post.find :all, :include =&gt; :special_comments # STI
     #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN comments ON ... AND comments.type = 'SpecialComment'
     #   Post.find :all, :include =&gt; [:comments, :special_comments] # special_comments is the reflection name, posts is the parent table name
     #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN comments ON ... LEFT OUTER JOIN comments special_comments_posts
-    # 
+    #
     # Acts as tree example:
-    # 
+    #
     #   TreeMixin.find :all, :include =&gt; :children
     #   # =&gt; SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ...
     #   TreeMixin.find :all, :include =&gt; {:children =&gt; :parent} # using cascading eager includes
-    #   # =&gt; SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ... 
+    #   # =&gt; SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ...
+    #                               LEFT OUTER JOIN parents_mixins ...
+    #   TreeMixin.find :all, :include =&gt; {:children =&gt; {:parent =&gt; :children}}
+    #   # =&gt; SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ...
     #                               LEFT OUTER JOIN parents_mixins ...
-    #   TreeMixin.find :all, :include =&gt; {:children =&gt; {:parent =&gt; :children}} 
-    #   # =&gt; SELECT ... FROM mixins LEFT OUTER JOIN mixins childrens_mixins ... 
-    #                               LEFT OUTER JOIN parents_mixins ... 
     #                               LEFT OUTER JOIN mixins childrens_mixins_2
-    # 
+    #
     # Has and Belongs to Many join tables use the same idea, but add a &lt;tt&gt;_join&lt;/tt&gt; suffix:
-    # 
+    #
     #   Post.find :all, :include =&gt; :categories
     #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN categories_posts ... LEFT OUTER JOIN categories ...
     #   Post.find :all, :include =&gt; {:categories =&gt; :posts}
@@ -523,18 +523,18 @@ module ActiveRecord
     #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN categories_posts ... LEFT OUTER JOIN categories ...
     #                              LEFT OUTER JOIN categories_posts posts_categories_join LEFT OUTER JOIN posts posts_categories
     #                              LEFT OUTER JOIN categories_posts categories_posts_join LEFT OUTER JOIN categories categories_posts
-    # 
+    #
     # If you wish to specify your own custom joins using a &lt;tt&gt;:joins&lt;/tt&gt; option, those table names will take precedence over the eager associations:
-    # 
+    #
     #   Post.find :all, :include =&gt; :comments, :joins =&gt; &quot;inner join comments ...&quot;
     #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN comments_posts ON ... INNER JOIN comments ...
     #   Post.find :all, :include =&gt; [:comments, :special_comments], :joins =&gt; &quot;inner join comments ...&quot;
-    #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN comments comments_posts ON ... 
+    #   # =&gt; SELECT ... FROM posts LEFT OUTER JOIN comments comments_posts ON ...
     #                              LEFT OUTER JOIN comments special_comments_posts ...
     #                              INNER JOIN comments ...
-    # 
+    #
     # Table aliases are automatically truncated according to the maximum length of table identifiers according to the specific database.
-    # 
+    #
     # == Modules
     #
     # By default, associations will look for objects within the current module scope. Consider:
@@ -575,12 +575,12 @@ module ActiveRecord
     # possible.
     module ClassMethods
       # Adds the following methods for retrieval and query of collections of associated objects:
-      # +collection+ is replaced with the symbol passed as the first argument, so 
+      # +collection+ is replaced with the symbol passed as the first argument, so
       # &lt;tt&gt;has_many :clients&lt;/tt&gt; would add among others &lt;tt&gt;clients.empty?&lt;/tt&gt;.
       # * &lt;tt&gt;collection(force_reload = false)&lt;/tt&gt; - returns an array of all the associated objects.
       #   An empty array is returned if none are found.
       # * &lt;tt&gt;collection&lt;&lt;(object, ...)&lt;/tt&gt; - adds one or more objects to the collection by setting their foreign keys to the collection's primary key.
-      # * &lt;tt&gt;collection.delete(object, ...)&lt;/tt&gt; - removes one or more objects from the collection by setting their foreign keys to NULL.  
+      # * &lt;tt&gt;collection.delete(object, ...)&lt;/tt&gt; - removes one or more objects from the collection by setting their foreign keys to NULL.
       #   This will also destroy the objects if they're declared as +belongs_to+ and dependent on this model.
       # * &lt;tt&gt;collection=objects&lt;/tt&gt; - replaces the collections content by deleting and adding objects as appropriate.
       # * &lt;tt&gt;collection_singular_ids&lt;/tt&gt; - returns an array of the associated objects' ids
@@ -592,7 +592,7 @@ module ActiveRecord
       # * &lt;tt&gt;collection.size&lt;/tt&gt; - returns the number of associated objects.
       # * &lt;tt&gt;collection.find&lt;/tt&gt; - finds an associated object according to the same rules as Base.find.
       # * &lt;tt&gt;collection.build(attributes = {}, ...)&lt;/tt&gt; - returns one or more new objects of the collection type that have been instantiated
-      #   with +attributes+ and linked to this object through a foreign key, but have not yet been saved. *Note:* This only works if an 
+      #   with +attributes+ and linked to this object through a foreign key, but have not yet been saved. *Note:* This only works if an
       #   associated object already exists, not if it's +nil+!
       # * &lt;tt&gt;collection.create(attributes = {})&lt;/tt&gt; - returns a new object of the collection type that has been instantiated
       #   with +attributes+, linked to this object through a foreign key, and that has already been saved (if it passed the validation).
@@ -612,7 +612,7 @@ module ActiveRecord
       # * &lt;tt&gt;Firm#clients.build&lt;/tt&gt; (similar to &lt;tt&gt;Client.new(&quot;firm_id&quot; =&gt; id)&lt;/tt&gt;)
       # * &lt;tt&gt;Firm#clients.create&lt;/tt&gt; (similar to &lt;tt&gt;c = Client.new(&quot;firm_id&quot; =&gt; id); c.save; c&lt;/tt&gt;)
       # The declaration can also include an options hash to specialize the behavior of the association.
-      # 
+      #
       # Options are:
       # * &lt;tt&gt;:class_name&lt;/tt&gt;  - specify the class name of the association. Use it only if that name can't be inferred
       #   from the association name. So &lt;tt&gt;has_many :products&lt;/tt&gt; will by default be linked to the +Product+ class, but
@@ -637,13 +637,13 @@ module ActiveRecord
       # * &lt;tt&gt;:group&lt;/tt&gt;: An attribute name by which the result should be grouped. Uses the &lt;tt&gt;GROUP BY&lt;/tt&gt; SQL-clause.
       # * &lt;tt&gt;:limit&lt;/tt&gt;: An integer determining the limit on the number of rows that should be returned.
       # * &lt;tt&gt;:offset&lt;/tt&gt;: An integer determining the offset from where the rows should be fetched. So at 5, it would skip the first 4 rows.
-      # * &lt;tt&gt;:select&lt;/tt&gt;: By default, this is &lt;tt&gt;*&lt;/tt&gt; as in &lt;tt&gt;SELECT * FROM&lt;/tt&gt;, but can be changed if you, for example, want to do a join 
+      # * &lt;tt&gt;:select&lt;/tt&gt;: By default, this is &lt;tt&gt;*&lt;/tt&gt; as in &lt;tt&gt;SELECT * FROM&lt;/tt&gt;, but can be changed if you, for example, want to do a join
       #   but not include the joined columns.
       # * &lt;tt&gt;:as&lt;/tt&gt;: Specifies a polymorphic interface (See &lt;tt&gt;#belongs_to&lt;/tt&gt;).
-      # * &lt;tt&gt;:through&lt;/tt&gt;: Specifies a Join Model through which to perform the query.  Options for &lt;tt&gt;:class_name&lt;/tt&gt; and &lt;tt&gt;:foreign_key&lt;/tt&gt; 
+      # * &lt;tt&gt;:through&lt;/tt&gt;: Specifies a Join Model through which to perform the query.  Options for &lt;tt&gt;:class_name&lt;/tt&gt; and &lt;tt&gt;:foreign_key&lt;/tt&gt;
       #   are ignored, as the association uses the source reflection. You can only use a &lt;tt&gt;:through&lt;/tt&gt; query through a &lt;tt&gt;belongs_to&lt;/tt&gt;
       #   or &lt;tt&gt;has_many&lt;/tt&gt; association on the join model.
-      # * &lt;tt&gt;:source&lt;/tt&gt;: Specifies the source association name used by &lt;tt&gt;has_many :through&lt;/tt&gt; queries.  Only use it if the name cannot be 
+      # * &lt;tt&gt;:source&lt;/tt&gt;: Specifies the source association name used by &lt;tt&gt;has_many :through&lt;/tt&gt; queries.  Only use it if the name cannot be
       #   inferred from the association.  &lt;tt&gt;has_many :subscribers, :through =&gt; :subscriptions&lt;/tt&gt; will look for either &lt;tt&gt;:subscribers&lt;/tt&gt; or
       #   &lt;tt&gt;:subscriber&lt;/tt&gt; on +Subscription+, unless a &lt;tt&gt;:source&lt;/tt&gt; is given.
       # * &lt;tt&gt;:source_type&lt;/tt&gt;: Specifies type of the source association used by &lt;tt&gt;has_many :through&lt;/tt&gt; queries where the source
@@ -669,7 +669,6 @@ module ActiveRecord
         configure_dependency_for_has_many(reflection)
 
         if options[:through]
-          collection_reader_method(reflection, HasManyThroughAssociation)
           collection_accessor_methods(reflection, HasManyThroughAssociation, false)
         else
           add_multiple_associated_save_callbacks(reflection.name)
@@ -679,10 +678,10 @@ module ActiveRecord
       end
 
       # Adds the following methods for retrieval and query of a single associated object:
-      # +association+ is replaced with the symbol passed as the first argument, so 
+      # +association+ is replaced with the symbol passed as the first argument, so
       # &lt;tt&gt;has_one :manager&lt;/tt&gt; would add among others &lt;tt&gt;manager.nil?&lt;/tt&gt;.
       # * &lt;tt&gt;association(force_reload = false)&lt;/tt&gt; - returns the associated object. +nil+ is returned if none is found.
-      # * &lt;tt&gt;association=(associate)&lt;/tt&gt; - assigns the associate object, extracts the primary key, sets it as the foreign key, 
+      # * &lt;tt&gt;association=(associate)&lt;/tt&gt; - assigns the associate object, extracts the primary key, sets it as the foreign key,
       #   and saves the associate object.
       # * &lt;tt&gt;association.nil?&lt;/tt&gt; - returns +true+ if there is no associated object.
       # * &lt;tt&gt;build_association(attributes = {})&lt;/tt&gt; - returns a new object of the associated type that has been instantiated
@@ -699,7 +698,7 @@ module ActiveRecord
       # * &lt;tt&gt;Account#create_beneficiary&lt;/tt&gt; (similar to &lt;tt&gt;b = Beneficiary.new(&quot;account_id&quot; =&gt; id); b.save; b&lt;/tt&gt;)
       #
       # The declaration can also include an options hash to specialize the behavior of the association.
-      # 
+      #
       # Options are:
       # * &lt;tt&gt;:class_name&lt;/tt&gt;  - specify the class name of the association. Use it only if that name can't be inferred
       #   from the association name. So &lt;tt&gt;has_one :manager&lt;/tt&gt; will by default be linked to the +Manager+ class, but
@@ -726,25 +725,28 @@ module ActiveRecord
       def has_one(association_id, options = {})
         reflection = create_has_one_reflection(association_id, options)
 
+        ivar = &quot;@#{reflection.name}&quot;
+
         module_eval do
           after_save &lt;&lt;-EOF
-            association = instance_variable_get(&quot;@#{reflection.name}&quot;)
+            association = instance_variable_get(&quot;#{ivar}&quot;) if instance_variable_defined?(&quot;#{ivar}&quot;)
+
             if !association.nil? &amp;&amp; (new_record? || association.new_record? || association[&quot;#{reflection.primary_key_name}&quot;] != id)
               association[&quot;#{reflection.primary_key_name}&quot;] = id
               association.save(true)
             end
           EOF
         end
-      
+
         association_accessor_methods(reflection, HasOneAssociation)
         association_constructor_method(:build,  reflection, HasOneAssociation)
         association_constructor_method(:create, reflection, HasOneAssociation)
-        
+
         configure_dependency_for_has_one(reflection)
       end
 
       # Adds the following methods for retrieval and query for a single associated object for which this object holds an id:
-      # +association+ is replaced with the symbol passed as the first argument, so 
+      # +association+ is replaced with the symbol passed as the first argument, so
       # &lt;tt&gt;belongs_to :author&lt;/tt&gt; would add among others &lt;tt&gt;author.nil?&lt;/tt&gt;.
       # * &lt;tt&gt;association(force_reload = false)&lt;/tt&gt; - returns the associated object. +nil+ is returned if none is found.
       # * &lt;tt&gt;association=(associate)&lt;/tt&gt; - assigns the associate object, extracts the primary key, and sets it as the foreign key.
@@ -762,7 +764,7 @@ module ActiveRecord
       # * &lt;tt&gt;Post#build_author&lt;/tt&gt; (similar to &lt;tt&gt;post.author = Author.new&lt;/tt&gt;)
       # * &lt;tt&gt;Post#create_author&lt;/tt&gt; (similar to &lt;tt&gt;post.author = Author.new; post.author.save; post.author&lt;/tt&gt;)
       # The declaration can also include an options hash to specialize the behavior of the association.
-      # 
+      #
       # Options are:
       # * &lt;tt&gt;:class_name&lt;/tt&gt;  - specify the class name of the association. Use it only if that name can't be inferred
       #   from the association name. So &lt;tt&gt;has_one :author&lt;/tt&gt; will by default be linked to the +Author+ class, but
@@ -774,37 +776,40 @@ module ActiveRecord
       # * &lt;tt&gt;:foreign_key&lt;/tt&gt; - specify the foreign key used for the association. By default this is guessed to be the name
       #   of the association with an +_id+ suffix. So a class that defines a +belongs_to :person+ association will use +person_id+ as the default +foreign_key+.
       #   Similarly, +belongs_to :favorite_person, :class_name =&gt; &quot;Person&quot;+ will use a foreign key of +favorite_person_id+.
-      # * &lt;tt&gt;:counter_cache&lt;/tt&gt; - caches the number of belonging objects on the associate class through the use of +increment_counter+ 
+      # * &lt;tt&gt;:counter_cache&lt;/tt&gt; - caches the number of belonging objects on the associate class through the use of +increment_counter+
       #   and +decrement_counter+. The counter cache is incremented when an object of this class is created and decremented when it's
       #   destroyed. This requires that a column named &lt;tt&gt;#{table_name}_count&lt;/tt&gt; (such as +comments_count+ for a belonging +Comment+ class)
-      #   is used on the associate class (such as a +Post+ class). You can also specify a custom counter cache column by providing 
+      #   is used on the associate class (such as a +Post+ class). You can also specify a custom counter cache column by providing
       #   a column name instead of a +true+/+false+ value to this option (e.g., &lt;tt&gt;:counter_cache =&gt; :my_custom_counter&lt;/tt&gt;.)
       #   Note: Specifying a counter_cache will add it to that model's list of readonly attributes using #attr_readonly.
       # * &lt;tt&gt;:include&lt;/tt&gt;  - specify second-order associations that should be eager loaded when this object is loaded.
       # * &lt;tt&gt;:polymorphic&lt;/tt&gt; - specify this association is a polymorphic association by passing +true+.
-      #   Note: If you've enabled the counter cache, then you may want to add the counter cache attribute 
+      #   Note: If you've enabled the counter cache, then you may want to add the counter cache attribute
       #   to the attr_readonly list in the associated classes (e.g. class Post; attr_readonly :comments_count; end).
       #
       # Option examples:
       #   belongs_to :firm, :foreign_key =&gt; &quot;client_of&quot;
       #   belongs_to :author, :class_name =&gt; &quot;Person&quot;, :foreign_key =&gt; &quot;author_id&quot;
-      #   belongs_to :valid_coupon, :class_name =&gt; &quot;Coupon&quot;, :foreign_key =&gt; &quot;coupon_id&quot;, 
+      #   belongs_to :valid_coupon, :class_name =&gt; &quot;Coupon&quot;, :foreign_key =&gt; &quot;coupon_id&quot;,
       #              :conditions =&gt; 'discounts &gt; #{payments_count}'
       #   belongs_to :attachable, :polymorphic =&gt; true
       def belongs_to(association_id, options = {})
         reflection = create_belongs_to_reflection(association_id, options)
-        
+
+        ivar = &quot;@#{reflection.name}&quot;
+
         if reflection.options[:polymorphic]
           association_accessor_methods(reflection, BelongsToPolymorphicAssociation)
 
           module_eval do
             before_save &lt;&lt;-EOF
-              association = instance_variable_get(&quot;@#{reflection.name}&quot;)
+              association = instance_variable_get(&quot;#{ivar}&quot;) if instance_variable_defined?(&quot;#{ivar}&quot;)
+
               if association &amp;&amp; association.target
                 if association.new_record?
                   association.save(true)
                 end
-                
+
                 if association.updated?
                   self[&quot;#{reflection.primary_key_name}&quot;] = association.id
                   self[&quot;#{reflection.options[:foreign_type]}&quot;] = association.class.base_class.name.to_s
@@ -819,16 +824,17 @@ module ActiveRecord
 
           module_eval do
             before_save &lt;&lt;-EOF
-              association = instance_variable_get(&quot;@#{reflection.name}&quot;)
-              if !association.nil? 
+              association = instance_variable_get(&quot;#{ivar}&quot;) if instance_variable_defined?(&quot;#{ivar}&quot;)
+
+              if !association.nil?
                 if association.new_record?
                   association.save(true)
                 end
-                
+
                 if association.updated?
                   self[&quot;#{reflection.primary_key_name}&quot;] = association.id
                 end
-              end            
+              end
             EOF
           end
         end
@@ -848,7 +854,7 @@ module ActiveRecord
             &quot;before_destroy '#{reflection.name}.class.decrement_counter(\&quot;#{cache_column}\&quot;, #{reflection.primary_key_name})&quot; +
             &quot; unless #{reflection.name}.nil?'&quot;
           )
-          
+
           module_eval(
             &quot;#{reflection.class_name}.send(:attr_readonly,\&quot;#{cache_column}\&quot;.intern) if defined?(#{reflection.class_name}) &amp;&amp; #{reflection.class_name}.respond_to?(:attr_readonly)&quot;
           )
@@ -858,11 +864,11 @@ module ActiveRecord
       # Associates two classes via an intermediate join table.  Unless the join table is explicitly specified as
       # an option, it is guessed using the lexical order of the class names. So a join between +Developer+ and +Project+
       # will give the default join table name of +developers_projects+ because &quot;D&quot; outranks &quot;P&quot;.  Note that this precedence
-      # is calculated using the &lt;tt&gt;&lt;&lt;/tt&gt; operator for &lt;tt&gt;String&lt;/tt&gt;.  This means that if the strings are of different lengths, 
+      # is calculated using the &lt;tt&gt;&lt;&lt;/tt&gt; operator for &lt;tt&gt;String&lt;/tt&gt;.  This means that if the strings are of different lengths,
       # and the strings are equal when compared up to the shortest length, then the longer string is considered of higher
-      # lexical precedence than the shorter one.  For example, one would expect the tables &lt;tt&gt;paper_boxes&lt;/tt&gt; and &lt;tt&gt;papers&lt;/tt&gt; 
+      # lexical precedence than the shorter one.  For example, one would expect the tables &lt;tt&gt;paper_boxes&lt;/tt&gt; and &lt;tt&gt;papers&lt;/tt&gt;
       # to generate a join table name of &lt;tt&gt;papers_paper_boxes&lt;/tt&gt; because of the length of the name &lt;tt&gt;paper_boxes&lt;/tt&gt;,
-      # but it in fact generates a join table name of &lt;tt&gt;paper_boxes_papers&lt;/tt&gt;.  Be aware of this caveat, and use the 
+      # but it in fact generates a join table name of &lt;tt&gt;paper_boxes_papers&lt;/tt&gt;.  Be aware of this caveat, and use the
       # custom &lt;tt&gt;join_table&lt;/tt&gt; option if you need to.
       #
       # Deprecated: Any additional fields added to the join table will be placed as attributes when pulling records out through
@@ -871,13 +877,13 @@ module ActiveRecord
       # associations with attributes to a real join model (see introduction).
       #
       # Adds the following methods for retrieval and query:
-      # +collection+ is replaced with the symbol passed as the first argument, so 
+      # +collection+ is replaced with the symbol passed as the first argument, so
       # &lt;tt&gt;has_and_belongs_to_many :categories&lt;/tt&gt; would add among others &lt;tt&gt;categories.empty?&lt;/tt&gt;.
       # * &lt;tt&gt;collection(force_reload = false)&lt;/tt&gt; - returns an array of all the associated objects.
       #   An empty array is returned if none are found.
-      # * &lt;tt&gt;collection&lt;&lt;(object, ...)&lt;/tt&gt; - adds one or more objects to the collection by creating associations in the join table 
+      # * &lt;tt&gt;collection&lt;&lt;(object, ...)&lt;/tt&gt; - adds one or more objects to the collection by creating associations in the join table
       #   (&lt;tt&gt;collection.push&lt;/tt&gt; and &lt;tt&gt;collection.concat&lt;/tt&gt; are aliases to this method).
-      # * &lt;tt&gt;collection.delete(object, ...)&lt;/tt&gt; - removes one or more objects from the collection by removing their associations from the join table.  
+      # * &lt;tt&gt;collection.delete(object, ...)&lt;/tt&gt; - removes one or more objects from the collection by removing their associations from the join table.
       #   This does not destroy the objects.
       # * &lt;tt&gt;collection=objects&lt;/tt&gt; - replaces the collection's content by deleting and adding objects as appropriate.
       # * &lt;tt&gt;collection_singular_ids&lt;/tt&gt; - returns an array of the associated objects' ids
@@ -906,10 +912,10 @@ module ActiveRecord
       # * &lt;tt&gt;Developer#projects.build&lt;/tt&gt; (similar to &lt;tt&gt;Project.new(&quot;project_id&quot; =&gt; id)&lt;/tt&gt;)
       # * &lt;tt&gt;Developer#projects.create&lt;/tt&gt; (similar to &lt;tt&gt;c = Project.new(&quot;project_id&quot; =&gt; id); c.save; c&lt;/tt&gt;)
       # The declaration may include an options hash to specialize the behavior of the association.
-      # 
+      #
       # Options are:
       # * &lt;tt&gt;:class_name&lt;/tt&gt; - specify the class name of the association. Use it only if that name can't be inferred
-      #   from the association name. So &lt;tt&gt;has_and_belongs_to_many :projects&lt;/tt&gt; will by default be linked to the 
+      #   from the association name. So &lt;tt&gt;has_and_belongs_to_many :projects&lt;/tt&gt; will by default be linked to the
       #   +Project+ class, but if the real class name is +SuperProject+, you'll have to specify it with this option.
       # * &lt;tt&gt;:join_table&lt;/tt&gt; - specify the name of the join table if the default based on lexical order isn't what you want.
       #   WARNING: If you're overwriting the table name of either class, the +table_name+ method MUST be declared underneath any
@@ -926,7 +932,7 @@ module ActiveRecord
       #   such as &lt;tt&gt;last_name, first_name DESC&lt;/tt&gt;
       # * &lt;tt&gt;:uniq&lt;/tt&gt; - if set to +true+, duplicate associated objects will be ignored by accessors and query methods
       # * &lt;tt&gt;:finder_sql&lt;/tt&gt; - overwrite the default generated SQL statement used to fetch the association with a manual statement
-      # * &lt;tt&gt;:delete_sql&lt;/tt&gt; - overwrite the default generated SQL statement used to remove links between the associated 
+      # * &lt;tt&gt;:delete_sql&lt;/tt&gt; - overwrite the default generated SQL statement used to remove links between the associated
       #   classes with a manual statement
       # * &lt;tt&gt;:insert_sql&lt;/tt&gt; - overwrite the default generated SQL statement used to add links between the associated classes
       #   with a manual statement
@@ -943,11 +949,11 @@ module ActiveRecord
       #   has_and_belongs_to_many :projects, :include =&gt; [ :milestones, :manager ]
       #   has_and_belongs_to_many :nations, :class_name =&gt; &quot;Country&quot;
       #   has_and_belongs_to_many :categories, :join_table =&gt; &quot;prods_cats&quot;
-      #   has_and_belongs_to_many :active_projects, :join_table =&gt; 'developers_projects', :delete_sql =&gt; 
+      #   has_and_belongs_to_many :active_projects, :join_table =&gt; 'developers_projects', :delete_sql =&gt;
       #   'DELETE FROM developers_projects WHERE active=1 AND developer_id = #{id} AND project_id = #{record.id}'
       def has_and_belongs_to_many(association_id, options = {}, &amp;extension)
         reflection = create_has_and_belongs_to_many_reflection(association_id, options, &amp;extension)
-        
+
         add_multiple_associated_save_callbacks(reflection.name)
         collection_accessor_methods(reflection, HasAndBelongsToManyAssociation)
 
@@ -981,88 +987,95 @@ module ActiveRecord
 
           table_name_prefix + join_table + table_name_suffix
         end
-      
+
         def association_accessor_methods(reflection, association_proxy_class)
+          ivar = &quot;@#{reflection.name}&quot;
+
           define_method(reflection.name) do |*params|
             force_reload = params.first unless params.empty?
-            association = instance_variable_get(&quot;@#{reflection.name}&quot;)
+
+            association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
 
             if association.nil? || force_reload
               association = association_proxy_class.new(self, reflection)
               retval = association.reload
               if retval.nil? and association_proxy_class == BelongsToAssociation
-                instance_variable_set(&quot;@#{reflection.name}&quot;, nil)
+                instance_variable_set(ivar, nil)
                 return nil
               end
-              instance_variable_set(&quot;@#{reflection.name}&quot;, association)
+              instance_variable_set(ivar, association)
             end
 
             association.target.nil? ? nil : association
           end
 
           define_method(&quot;#{reflection.name}=&quot;) do |new_value|
-            association = instance_variable_get(&quot;@#{reflection.name}&quot;)
+            association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
+
             if association.nil? || association.target != new_value
               association = association_proxy_class.new(self, reflection)
             end
 
             association.replace(new_value)
 
-            unless new_value.nil?
-              instance_variable_set(&quot;@#{reflection.name}&quot;, association)
-            else
-              instance_variable_set(&quot;@#{reflection.name}&quot;, nil)
-            end
+            instance_variable_set(ivar, new_value.nil? ? nil : association)
           end
 
           define_method(&quot;set_#{reflection.name}_target&quot;) do |target|
             return if target.nil? and association_proxy_class == BelongsToAssociation
             association = association_proxy_class.new(self, reflection)
             association.target = target
-            instance_variable_set(&quot;@#{reflection.name}&quot;, association)
+            instance_variable_set(ivar, association)
           end
         end
 
         def collection_reader_method(reflection, association_proxy_class)
           define_method(reflection.name) do |*params|
+            ivar = &quot;@#{reflection.name}&quot;
+
             force_reload = params.first unless params.empty?
-            association = instance_variable_get(&quot;@#{reflection.name}&quot;)
+            association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
 
             unless association.respond_to?(:loaded?)
               association = association_proxy_class.new(self, reflection)
-              instance_variable_set(&quot;@#{reflection.name}&quot;, association)
+              instance_variable_set(ivar, association)
             end
 
             association.reload if force_reload
 
             association
           end
+
+          define_method(&quot;#{reflection.name.to_s.singularize}_ids&quot;) do
+            send(reflection.name).map(&amp;:id)
+          end
         end
 
         def collection_accessor_methods(reflection, association_proxy_class, writer = true)
           collection_reader_method(reflection, association_proxy_class)
 
-          define_method(&quot;#{reflection.name}=&quot;) do |new_value|
-            # Loads proxy class instance (defined in collection_reader_method) if not already loaded
-            association = send(reflection.name) 
-            association.replace(new_value)
-            association
-          end
+          if writer
+            define_method(&quot;#{reflection.name}=&quot;) do |new_value|
+              # Loads proxy class instance (defined in collection_reader_method) if not already loaded
+              association = send(reflection.name)
+              association.replace(new_value)
+              association
+            end
 
-          define_method(&quot;#{reflection.name.to_s.singularize}_ids&quot;) do
-            send(reflection.name).map(&amp;:id)
+            define_method(&quot;#{reflection.name.to_s.singularize}_ids=&quot;) do |new_value|
+              ids = (new_value || []).reject { |nid| nid.blank? }
+              send(&quot;#{reflection.name}=&quot;, reflection.class_name.constantize.find(ids))
+            end
           end
-
-          define_method(&quot;#{reflection.name.to_s.singularize}_ids=&quot;) do |new_value|
-            ids = (new_value || []).reject { |nid| nid.blank? }
-            send(&quot;#{reflection.name}=&quot;, reflection.class_name.constantize.find(ids))
-          end if writer
         end
 
         def add_multiple_associated_save_callbacks(association_name)
           method_name = &quot;validate_associated_records_for_#{association_name}&quot;.to_sym
+          ivar = &quot;@#{association_name}&quot;
+
           define_method(method_name) do
-            association = instance_variable_get(&quot;@#{association_name}&quot;)
+            association = instance_variable_get(ivar) if instance_variable_defined?(ivar)
+
             if association.respond_to?(:loaded?)
               if new_record?
                 association
@@ -1078,7 +1091,7 @@ module ActiveRecord
           before_save(&quot;@new_record_before_save = new_record?; true&quot;)
 
           after_callback = &lt;&lt;-end_eval
-            association = instance_variable_get(&quot;@#{association_name}&quot;)
+            association = instance_variable_get(&quot;#{ivar}&quot;) if instance_variable_defined?(&quot;#{ivar}&quot;)
 
             records_to_save = if @new_record_before_save
               association
@@ -1089,7 +1102,7 @@ module ActiveRecord
             end
 
             records_to_save.each { |record| association.send(:insert_record, record) } unless records_to_save.blank?
-            
+
             # reconstruct the SQL queries now that we know the owner's id
             association.send(:construct_sql) if association.respond_to?(:construct_sql)
           end_eval
@@ -1101,13 +1114,15 @@ module ActiveRecord
 
         def association_constructor_method(constructor, reflection, association_proxy_class)
           define_method(&quot;#{constructor}_#{reflection.name}&quot;) do |*params|
+            ivar = &quot;@#{reflection.name}&quot;
+
             attributees      = params.first unless params.empty?
             replace_existing = params[1].nil? ? true : params[1]
-            association      = instance_variable_get(&quot;@#{reflection.name}&quot;)
+            association      = instance_variable_get(ivar) if instance_variable_defined?(ivar)
 
             if association.nil?
               association = association_proxy_class.new(self, reflection)
-              instance_variable_set(&quot;@#{reflection.name}&quot;, association)
+              instance_variable_set(ivar, association)
             end
 
             if association_proxy_class == HasOneAssociation
@@ -1117,7 +1132,7 @@ module ActiveRecord
             end
           end
         end
-        
+
         def find_with_associations(options = {})
           catch :invalid_query do
             join_dependency = JoinDependency.new(self, merge_includes(scope(:find, :include), options[:include]), options[:joins])
@@ -1173,12 +1188,12 @@ module ActiveRecord
             :select, :conditions, :include, :order, :group, :limit, :offset,
             :as, :through, :source, :source_type,
             :uniq,
-            :finder_sql, :counter_sql, 
-            :before_add, :after_add, :before_remove, :after_remove, 
+            :finder_sql, :counter_sql,
+            :before_add, :after_add, :before_remove, :after_remove,
             :extend
           )
 
-          options[:extend] = create_extension_modules(association_id, extension, options[:extend]) if block_given?
+          options[:extend] = create_extension_modules(association_id, extension, options[:extend])
 
           create_reflection(:has_many, association_id, options, self)
         end
@@ -1193,10 +1208,10 @@ module ActiveRecord
 
         def create_belongs_to_reflection(association_id, options)
           options.assert_valid_keys(
-            :class_name, :foreign_key, :foreign_type, :remote, :conditions, :order, :include, :dependent, 
+            :class_name, :foreign_key, :foreign_type, :remote, :conditions, :order, :include, :dependent,
             :counter_cache, :extend, :polymorphic
           )
-          
+
           reflection = create_reflection(:belongs_to, association_id, options, self)
 
           if options[:polymorphic]
@@ -1205,23 +1220,23 @@ module ActiveRecord
 
           reflection
         end
-        
+
         def create_has_and_belongs_to_many_reflection(association_id, options, &amp;extension)
           options.assert_valid_keys(
-            :class_name, :table_name, :join_table, :foreign_key, :association_foreign_key, 
+            :class_name, :table_name, :join_table, :foreign_key, :association_foreign_key,
             :select, :conditions, :include, :order, :group, :limit, :offset,
-            :uniq, 
+            :uniq,
             :finder_sql, :delete_sql, :insert_sql,
-            :before_add, :after_add, :before_remove, :after_remove, 
+            :before_add, :after_add, :before_remove, :after_remove,
             :extend
           )
 
-          options[:extend] = create_extension_modules(association_id, extension, options[:extend]) if block_given?
+          options[:extend] = create_extension_modules(association_id, extension, options[:extend])
 
           reflection = create_reflection(:has_and_belongs_to_many, association_id, options, self)
 
           reflection.options[:join_table] ||= join_table_name(undecorated_table_name(self.to_s), undecorated_table_name(reflection.class_name))
-          
+
           reflection
         end
 
@@ -1232,7 +1247,7 @@ module ActiveRecord
         def guard_against_unlimitable_reflections(reflections, options)
           if (options[:offset] || options[:limit]) &amp;&amp; !using_limitable_reflections?(reflections)
             raise(
-              ConfigurationError, 
+              ConfigurationError,
               &quot;You can not use offset and limit together with has_many or has_and_belongs_to_many associations&quot;
             )
           end
@@ -1249,7 +1264,7 @@ module ActiveRecord
           scope = scope(:find)
           sql = &quot;SELECT #{column_aliases(join_dependency)} FROM #{(scope &amp;&amp; scope[:from]) || options[:from] || quoted_table_name} &quot;
           sql &lt;&lt; join_dependency.join_associations.collect{|join| join.association_join }.join
- 
+
           add_joins!(sql, options, scope)
           add_conditions!(sql, options[:conditions], scope)
           add_limited_ids_condition!(sql, options, join_dependency) if !using_limitable_reflections?(join_dependency.reflections) &amp;&amp; ((scope &amp;&amp; scope[:limit]) || options[:limit])
@@ -1258,10 +1273,10 @@ module ActiveRecord
           add_order!(sql, options[:order], scope)
           add_limit!(sql, options, scope) if using_limitable_reflections?(join_dependency.reflections)
           add_lock!(sql, options, scope)
- 
+
           return sanitize_sql(sql)
         end
- 
+
         def add_limited_ids_condition!(sql, options, join_dependency)
           unless (id_list = select_limited_ids_list(options, join_dependency)).empty?
             sql &lt;&lt; &quot;#{condition_word(sql)} #{connection.quote_table_name table_name}.#{primary_key} IN (#{id_list}) &quot;
@@ -1324,7 +1339,7 @@ module ActiveRecord
             condition_table_name != table_name
           end
         end
-        
+
         # Checks if the query order references a table other than the current model's table.
         def include_eager_order?(options)
           order = options[:order]
@@ -1362,13 +1377,16 @@ module ActiveRecord
         end
 
         def create_extension_modules(association_id, block_extension, extensions)
-          extension_module_name = &quot;#{self.to_s}#{association_id.to_s.camelize}AssociationExtension&quot;
+          if block_extension
+            extension_module_name = &quot;#{self.to_s}#{association_id.to_s.camelize}AssociationExtension&quot;
 
-          silence_warnings do
-            Object.const_set(extension_module_name, Module.new(&amp;block_extension))
+            silence_warnings do
+              Object.const_set(extension_module_name, Module.new(&amp;block_extension))
+            end
+            Array(extensions).push(extension_module_name.constantize)
+          else
+            Array(extensions)
           end
-
-          Array(extensions).push(extension_module_name.constantize)
         end
 
         class JoinDependency # :nodoc:
@@ -1526,13 +1544,15 @@ module ActiveRecord
             end
 
             def column_names_with_alias
-              unless @column_names_with_alias
+              unless defined?(@column_names_with_alias)
                 @column_names_with_alias = []
+
                 ([primary_key] + (column_names - [primary_key])).each_with_index do |column_name, i|
                   @column_names_with_alias &lt;&lt; [column_name, &quot;#{ aliased_prefix }_r#{ i }&quot;]
                 end
               end
-              return @column_names_with_alias
+
+              @column_names_with_alias
             end
 
             def extract_record(row)
@@ -1568,7 +1588,7 @@ module ActiveRecord
               if !parent.table_joins.blank? &amp;&amp; parent.table_joins.to_s.downcase =~ %r{join(\s+\w+)?\s+#{aliased_table_name.downcase}\son}
                 join_dependency.table_aliases[aliased_table_name] += 1
               end
-              
+
               unless join_dependency.table_aliases[aliased_table_name].zero?
                 # if the table name has been used, then use an alias
                 @aliased_table_name = active_record.connection.table_alias_for &quot;#{pluralize(reflection.name)}_#{parent_table_name}&quot;
@@ -1578,7 +1598,7 @@ module ActiveRecord
               else
                 join_dependency.table_aliases[aliased_table_name] += 1
               end
-              
+
               if reflection.macro == :has_and_belongs_to_many || (reflection.macro == :has_many &amp;&amp; reflection.options[:through])
                 @aliased_join_table_name = reflection.macro == :has_and_belongs_to_many ? reflection.options[:join_table] : reflection.through_reflection.klass.table_name
                 unless join_dependency.table_aliases[aliased_join_table_name].zero?
@@ -1601,22 +1621,22 @@ module ActiveRecord
                      connection.quote_table_name(aliased_join_table_name),
                      options[:foreign_key] || reflection.active_record.to_s.foreign_key,
                      connection.quote_table_name(parent.aliased_table_name),
-		     reflection.active_record.primary_key] +
+                     reflection.active_record.primary_key] +
                   &quot; #{join_type} %s ON %s.%s = %s.%s &quot; % [
                      table_name_and_alias,
-		     connection.quote_table_name(aliased_table_name),
-		     klass.primary_key,
+                     connection.quote_table_name(aliased_table_name),
+                     klass.primary_key,
                      connection.quote_table_name(aliased_join_table_name),
-		     options[:association_foreign_key] || klass.to_s.foreign_key
+                     options[:association_foreign_key] || klass.to_s.foreign_key
                      ]
                 when :has_many, :has_one
                   case
                     when reflection.macro == :has_many &amp;&amp; reflection.options[:through]
                       through_conditions = through_reflection.options[:conditions] ? &quot;AND #{interpolate_sql(sanitize_sql(through_reflection.options[:conditions]))}&quot; : ''
-                      
-                      jt_foreign_key = jt_as_extra = jt_source_extra = jt_sti_extra = nil 
-                      first_key = second_key = as_extra = nil 
-                      
+
+                      jt_foreign_key = jt_as_extra = jt_source_extra = jt_sti_extra = nil
+                      first_key = second_key = as_extra = nil
+
                       if through_reflection.options[:as] # has_many :through against a polymorphic join
                         jt_foreign_key = through_reflection.options[:as].to_s + '_id'
                         jt_as_extra = &quot; AND %s.%s = %s&quot; % [
@@ -1625,24 +1645,24 @@ module ActiveRecord
                           klass.quote_value(parent.active_record.base_class.name)
                         ]
                       else
-                        jt_foreign_key = through_reflection.primary_key_name 
+                        jt_foreign_key = through_reflection.primary_key_name
                       end
-                        
+
                       case source_reflection.macro
                       when :has_many
-                        if source_reflection.options[:as] 
-                          first_key   = &quot;#{source_reflection.options[:as]}_id&quot; 
-                          second_key  = options[:foreign_key] || primary_key 
+                        if source_reflection.options[:as]
+                          first_key   = &quot;#{source_reflection.options[:as]}_id&quot;
+                          second_key  = options[:foreign_key] || primary_key
                           as_extra    = &quot; AND %s.%s = %s&quot; % [
                             connection.quote_table_name(aliased_table_name),
                             connection.quote_column_name(&quot;#{source_reflection.options[:as]}_type&quot;),
-                            klass.quote_value(source_reflection.active_record.base_class.name) 
+                            klass.quote_value(source_reflection.active_record.base_class.name)
                           ]
                         else
                           first_key   = through_reflection.klass.base_class.to_s.foreign_key
                           second_key  = options[:foreign_key] || primary_key
                         end
-                        
+
                         unless through_reflection.klass.descends_from_active_record?
                           jt_sti_extra = &quot; AND %s.%s = %s&quot; % [
                             connection.quote_table_name(aliased_join_table_name),
@@ -1666,17 +1686,17 @@ module ActiveRecord
                       &quot; #{join_type} %s ON (%s.%s = %s.%s%s%s%s) &quot; % [
                         table_alias_for(through_reflection.klass.table_name, aliased_join_table_name),
                         connection.quote_table_name(parent.aliased_table_name),
-			connection.quote_column_name(parent.primary_key),
+                        connection.quote_column_name(parent.primary_key),
                         connection.quote_table_name(aliased_join_table_name),
-			connection.quote_column_name(jt_foreign_key),
+                        connection.quote_column_name(jt_foreign_key),
                         jt_as_extra, jt_source_extra, jt_sti_extra
                       ] +
                       &quot; #{join_type} %s ON (%s.%s = %s.%s%s) &quot; % [
-                        table_name_and_alias, 
+                        table_name_and_alias,
                         connection.quote_table_name(aliased_table_name),
-			connection.quote_column_name(first_key),
+                        connection.quote_column_name(first_key),
                         connection.quote_table_name(aliased_join_table_name),
-			connection.quote_column_name(second_key),
+                        connection.quote_column_name(second_key),
                         as_extra
                       ]
 
@@ -1684,11 +1704,11 @@ module ActiveRecord
                       &quot; #{join_type} %s ON %s.%s = %s.%s AND %s.%s = %s&quot; % [
                         table_name_and_alias,
                         connection.quote_table_name(aliased_table_name),
-			&quot;#{reflection.options[:as]}_id&quot;,
+                        &quot;#{reflection.options[:as]}_id&quot;,
                         connection.quote_table_name(parent.aliased_table_name),
-			parent.primary_key,
+                        parent.primary_key,
                         connection.quote_table_name(aliased_table_name),
-			&quot;#{reflection.options[:as]}_type&quot;,
+                        &quot;#{reflection.options[:as]}_type&quot;,
                         klass.quote_value(parent.active_record.base_class.name)
                       ]
                     else
@@ -1696,18 +1716,18 @@ module ActiveRecord
                       &quot; #{join_type} %s ON %s.%s = %s.%s &quot; % [
                         table_name_and_alias,
                         aliased_table_name,
-			foreign_key,
+                        foreign_key,
                         parent.aliased_table_name,
-			parent.primary_key
+                        parent.primary_key
                       ]
                   end
                 when :belongs_to
                   &quot; #{join_type} %s ON %s.%s = %s.%s &quot; % [
                      table_name_and_alias,
-		     connection.quote_table_name(aliased_table_name),
-		     reflection.klass.primary_key,
+                     connection.quote_table_name(aliased_table_name),
+                     reflection.klass.primary_key,
                      connection.quote_table_name(parent.aliased_table_name),
-		     options[:foreign_key] || reflection.primary_key_name
+                     options[:foreign_key] || reflection.primary_key_name
                     ]
                 else
                   &quot;&quot;
@@ -1723,15 +1743,14 @@ module ActiveRecord
 
               join
             end
-            
-            protected
 
+            protected
               def pluralize(table_name)
                 ActiveRecord::Base.pluralize_table_names ? table_name.to_s.pluralize : table_name
               end
-              
+
               def table_alias_for(table_name, table_alias)
-	         &quot;#{reflection.active_record.connection.quote_table_name(table_name)} #{table_alias if table_name != table_alias}&quot;.strip
+                 &quot;#{reflection.active_record.connection.quote_table_name(table_name)} #{table_alias if table_name != table_alias}&quot;.strip
               end
 
               def table_name_and_alias
@@ -1739,11 +1758,10 @@ module ActiveRecord
               end
 
               def interpolate_sql(sql)
-                instance_eval(&quot;%@#{sql.gsub('@', '\@')}@&quot;) 
-              end 
+                instance_eval(&quot;%@#{sql.gsub('@', '\@')}@&quot;)
+              end
 
             private
-
               def join_type
                 &quot;LEFT OUTER JOIN&quot;
               end</diff>
      <filename>activerecord/lib/active_record/associations.rb</filename>
    </modified>
    <modified>
      <diff>@@ -33,10 +33,10 @@ module ActiveRecord
 
           if ids.size == 1
             id = ids.first.to_i
-            record = load_target.detect { |record| id == record.id }
+            record = load_target.detect { |r| id == r.id }
             expects_array ? [record] : record
           else
-            load_target.select { |record| ids.include?(record.id) }
+            load_target.select { |r| ids.include?(r.id) }
           end
         else
           conditions = &quot;#{@finder_sql}&quot;
@@ -84,19 +84,19 @@ module ActiveRecord
           else
             columns = @owner.connection.columns(@reflection.options[:join_table], &quot;#{@reflection.options[:join_table]} Columns&quot;)
 
-            attributes = columns.inject({}) do |attributes, column|
+            attributes = columns.inject({}) do |attrs, column|
               case column.name
                 when @reflection.primary_key_name
-                  attributes[column.name] = @owner.quoted_id
+                  attrs[column.name] = @owner.quoted_id
                 when @reflection.association_foreign_key
-                  attributes[column.name] = record.quoted_id
+                  attrs[column.name] = record.quoted_id
                 else
-                  if record.attributes.has_key?(column.name)
+                  if record.has_attribute?(column.name)
                     value = @owner.send(:quote_value, record[column.name], column)
-                    attributes[column.name] = value unless value.nil?
+                    attrs[column.name] = value unless value.nil?
                   end
               end
-              attributes
+              attrs
             end
 
             sql =</diff>
      <filename>activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb</filename>
    </modified>
    <modified>
      <diff>@@ -41,10 +41,10 @@ module ActiveRecord
 
           if ids.size == 1
             id = ids.first
-            record = load_target.detect { |record| id == record.id }
+            record = load_target.detect { |r| id == r.id }
             expects_array ? [ record ] : record
           else
-            load_target.select { |record| ids.include?(record.id) }
+            load_target.select { |r| ids.include?(r.id) }
           end
         else
           conditions = &quot;#{@finder_sql}&quot;</diff>
      <filename>activerecord/lib/active_record/associations/has_many_association.rb</filename>
    </modified>
    <modified>
      <diff>@@ -262,12 +262,31 @@ module ActiveRecord
         end
 
         def conditions
-          @conditions ||= [
-            (interpolate_sql(@reflection.klass.send(:sanitize_sql, @reflection.options[:conditions])) if @reflection.options[:conditions]),
-            (interpolate_sql(@reflection.active_record.send(:sanitize_sql, @reflection.through_reflection.options[:conditions])) if @reflection.through_reflection.options[:conditions]),
-            (interpolate_sql(@reflection.active_record.send(:sanitize_sql, @reflection.source_reflection.options[:conditions])) if @reflection.source_reflection.options[:conditions]),
-            (&quot;#{@reflection.through_reflection.table_name}.#{@reflection.through_reflection.klass.inheritance_column} = #{@reflection.klass.quote_value(@reflection.through_reflection.klass.name.demodulize)}&quot; unless @reflection.through_reflection.klass.descends_from_active_record?)
-          ].compact.collect { |condition| &quot;(#{condition})&quot; }.join(' AND ') unless (!@reflection.options[:conditions] &amp;&amp; !@reflection.through_reflection.options[:conditions]  &amp;&amp; !@reflection.source_reflection.options[:conditions] &amp;&amp; @reflection.through_reflection.klass.descends_from_active_record?)
+          @conditions = build_conditions unless defined?(@conditions)
+          @conditions
+        end
+
+        def build_conditions
+          association_conditions = @reflection.options[:conditions]
+          through_conditions = @reflection.through_reflection.options[:conditions]
+          source_conditions = @reflection.source_reflection.options[:conditions]
+          uses_sti = !@reflection.through_reflection.klass.descends_from_active_record?
+
+          if association_conditions || through_conditions || source_conditions || uses_sti
+            all = []
+
+            [association_conditions, through_conditions, source_conditions].each do |conditions|
+              all &lt;&lt; interpolate_sql(sanitize_sql(conditions)) if conditions
+            end
+
+            all &lt;&lt; build_sti_condition if uses_sti
+
+            all.map { |sql| &quot;(#{sql})&quot; } * ' AND '
+          end
+        end
+
+        def build_sti_condition
+          &quot;#{@reflection.through_reflection.table_name}.#{@reflection.through_reflection.klass.inheritance_column} = #{@reflection.klass.quote_value(@reflection.through_reflection.klass.name.demodulize)}&quot;
         end
 
         alias_method :sql_conditions, :conditions</diff>
      <filename>activerecord/lib/active_record/associations/has_many_through_association.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ module ActiveRecord
 
     def self.included(base)
       base.extend ClassMethods
-      base.attribute_method_suffix *DEFAULT_SUFFIXES
+      base.attribute_method_suffix(*DEFAULT_SUFFIXES)
       base.cattr_accessor :attribute_types_cached_by_default, :instance_writer =&gt; false
       base.attribute_types_cached_by_default = ATTRIBUTE_TYPES_CACHED_BY_DEFAULT
     end</diff>
      <filename>activerecord/lib/active_record/attribute_methods.rb</filename>
    </modified>
    <modified>
      <diff>@@ -592,7 +592,7 @@ module ActiveRecord #:nodoc:
       def update(id, attributes)
         if id.is_a?(Array)
           idx = -1
-          id.collect { |id| idx += 1; update(id, attributes[idx]) }
+          id.collect { |one_id| idx += 1; update(one_id, attributes[idx]) }
         else
           object = find(id)
           object.update_attributes(attributes)
@@ -642,7 +642,11 @@ module ActiveRecord #:nodoc:
       #   todos = [1,2,3]
       #   Todo.destroy(todos)
       def destroy(id)
-        id.is_a?(Array) ? id.each { |id| destroy(id) } : find(id).destroy
+        if id.is_a?(Array)
+          id.map { |one_id| destroy(one_id) }
+        else
+          find(id).destroy
+        end
       end
 
       # Updates all records with details given if they match a set of conditions supplied, limits and order can
@@ -1075,9 +1079,9 @@ module ActiveRecord #:nodoc:
 
       # Returns an array of column objects for the table associated with this class.
       def columns
-        unless @columns
+        unless defined?(@columns) &amp;&amp; @columns
           @columns = connection.columns(table_name, &quot;#{name} Columns&quot;)
-          @columns.each {|column| column.primary = column.name == primary_key}
+          @columns.each { |column| column.primary = column.name == primary_key }
         end
         @columns
       end
@@ -1217,7 +1221,7 @@ module ActiveRecord #:nodoc:
       # Returns whether this class is a base AR class.  If A is a base class and
       # B descends from A, then B.base_class will return B.
       def abstract_class?
-        abstract_class == true
+        defined?(@abstract_class) &amp;&amp; @abstract_class == true
       end
 
       private
@@ -1428,7 +1432,7 @@ module ActiveRecord #:nodoc:
           case join
           when Symbol, Hash, Array
             join_dependency = ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, join, nil)
-            sql &lt;&lt; &quot; #{join_dependency.join_associations.collect{|join| join.association_join }.join} &quot;
+            sql &lt;&lt; &quot; #{join_dependency.join_associations.collect { |assoc| assoc.association_join }.join} &quot;
           else
             sql &lt;&lt; &quot; #{join} &quot;
           end
@@ -1962,7 +1966,7 @@ module ActiveRecord #:nodoc:
 
       # Returns true if this object hasn't been saved yet -- that is, a record for the object doesn't exist yet.
       def new_record?
-        @new_record
+        defined?(@new_record) &amp;&amp; @new_record
       end
 
       # * No record exists: Creates a new record with values matching those of the object attributes.
@@ -2213,7 +2217,7 @@ module ActiveRecord #:nodoc:
       # Returns +true+ if the record is read only. Records loaded through joins with piggy-back
       # attributes will be marked as read only since they cannot be saved.
       def readonly?
-        @readonly == true
+        defined?(@readonly) &amp;&amp; @readonly == true
       end
 
       # Marks this record as read only.
@@ -2334,11 +2338,11 @@ module ActiveRecord #:nodoc:
       # Returns a copy of the attributes hash where all the values have been safely quoted for use in
       # an SQL statement.
       def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true)
-        quoted = attributes.inject({}) do |quoted, (name, value)|
+        quoted = attributes.inject({}) do |result, (name, value)|
           if column = column_for_attribute(name)
-            quoted[name] = quote_value(value, column) unless !include_primary_key &amp;&amp; column.primary
+            result[name] = quote_value(value, column) unless !include_primary_key &amp;&amp; column.primary
           end
-          quoted
+          result
         end
         include_readonly_attributes ? quoted : remove_readonly_attributes(quoted)
       end
@@ -2454,9 +2458,9 @@ module ActiveRecord #:nodoc:
       end
 
       def clone_attributes(reader_method = :read_attribute, attributes = {})
-        self.attribute_names.inject(attributes) do |attributes, name|
-          attributes[name] = clone_attribute_value(reader_method, name)
-          attributes
+        self.attribute_names.inject(attributes) do |attrs, name|
+          attrs[name] = clone_attribute_value(reader_method, name)
+          attrs
         end
       end
 </diff>
      <filename>activerecord/lib/active_record/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -71,7 +71,7 @@ module ActiveRecord
       # also be used to &quot;borrow&quot; the connection to do database work unrelated
       # to any of the specific Active Records.
       def connection
-        if @active_connection_name &amp;&amp; (conn = active_connections[@active_connection_name])
+        if defined?(@active_connection_name) &amp;&amp; (conn = active_connections[@active_connection_name])
           conn
         else
           # retrieve_connection sets the cache key.</diff>
      <filename>activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb</filename>
    </modified>
    <modified>
      <diff>@@ -192,14 +192,14 @@ module ActiveRecord
           end
 
           def fallback_string_to_date(string)
-            new_date *ParseDate.parsedate(string)[0..2]
+            new_date(*ParseDate.parsedate(string)[0..2])
           end
 
           def fallback_string_to_time(string)
             time_hash = Date._parse(string)
             time_hash[:sec_fraction] = microseconds(time_hash)
 
-            new_time *time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction)
+            new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
           end
       end
 </diff>
      <filename>activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -30,6 +30,7 @@ module ActiveRecord
         @connection, @logger = connection, logger
         @runtime = 0
         @last_verification = 0
+        @query_cache_enabled = false
       end
 
       # Returns the human-readable name of the adapter.  Use mixed case - one</diff>
      <filename>activerecord/lib/active_record/connection_adapters/abstract_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -230,7 +230,7 @@ module ActiveRecord
       # recursively. We use @ignore_new_methods as a guard to indicate whether
       # it is safe for the call to proceed.
       def singleton_method_added(sym) #:nodoc:
-        return if @ignore_new_methods
+        return if defined?(@ignore_new_methods) &amp;&amp; @ignore_new_methods
 
         begin
           @ignore_new_methods = true
@@ -356,15 +356,14 @@ module ActiveRecord
 
     private
       def migration_classes
-        migrations = migration_files.inject([]) do |migrations, migration_file|
+        classes = migration_files.inject([]) do |migrations, migration_file|
           load(migration_file)
           version, name = migration_version_and_name(migration_file)
           assert_unique_migration_version(migrations, version.to_i)
           migrations &lt;&lt; migration_class(name, version.to_i)
-        end
+        end.sort_by(&amp;:version)
 
-        sorted = migrations.sort_by { |m| m.version }
-        down? ? sorted.reverse : sorted
+        down? ? classes.reverse : classes
       end
 
       def assert_unique_migration_version(migrations, version)</diff>
      <filename>activerecord/lib/active_record/migration.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@ module ActiveRecord
       end
     end
 
-    # Transactions are protective blocks where SQL statements are only permanent if they can all succeed as one atomic action. 
+    # Transactions are protective blocks where SQL statements are only permanent if they can all succeed as one atomic action.
     # The classic example is a transfer between two accounts where you can only have a deposit if the withdrawal succeeded and
     # vice versa. Transactions enforce the integrity of the database and guard the data against program errors or database break-downs.
     # So basically you should use transaction blocks whenever you have a number of statements that must be executed together or
@@ -116,7 +116,7 @@ module ActiveRecord
     def rollback_active_record_state!
       id_present = has_attribute?(self.class.primary_key)
       previous_id = id
-      previous_new_record = @new_record
+      previous_new_record = new_record?
       yield
     rescue Exception
       @new_record = previous_new_record
@@ -125,7 +125,7 @@ module ActiveRecord
       else
         @attributes.delete(self.class.primary_key)
         @attributes_cache.delete(self.class.primary_key)
-      end  
+      end
       raise
     end
   end</diff>
      <filename>activerecord/lib/active_record/transactions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,13 +3,16 @@ require 'abstract_unit'
 class ActiveSchemaTest &lt; Test::Unit::TestCase
   def setup
     ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
-      alias_method :real_execute, :execute
+      alias_method :execute_without_stub, :execute
       def execute(sql, name = nil) return sql end
     end
   end
 
   def teardown
-    ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:alias_method, :execute, :real_execute)
+    ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
+      remove_method :execute
+      alias_method :execute, :execute_without_stub
+    end
   end
 
   def test_drop_table</diff>
      <filename>activerecord/test/active_schema_test_mysql.rb</filename>
    </modified>
    <modified>
      <diff>@@ -76,6 +76,7 @@ class AdapterTest &lt; Test::Unit::TestCase
     assert_equal 'dbo_posts',  @connection.table_alias_for('dbo.posts')
 
     class &lt;&lt; @connection
+      remove_method :table_alias_length
       alias_method :table_alias_length, :old_table_alias_length
     end
   end</diff>
      <filename>activerecord/test/adapter_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -128,7 +128,7 @@ class AssociationCallbacksTest &lt; Test::Unit::TestCase
     callback_log = [&quot;before_adding&lt;new&gt;&quot;, &quot;after_adding&lt;new&gt;&quot;]
     assert_equal callback_log, project.developers_log
     assert project.save
-    assert_equal 1, project.developers_with_callbacks.count
+    assert_equal 1, project.developers_with_callbacks.size
     assert_equal callback_log, project.developers_log
   end
 </diff>
      <filename>activerecord/test/associations/callbacks_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -304,7 +304,7 @@ class AssociationsJoinModelTest &lt; Test::Unit::TestCase
   end
 
   def test_unavailable_through_reflection
-    assert_raises (ActiveRecord::HasManyThroughAssociationNotFoundError) { authors(:david).nothings }
+    assert_raise(ActiveRecord::HasManyThroughAssociationNotFoundError) { authors(:david).nothings }
   end
 
   def test_has_many_through_join_model_with_conditions
@@ -313,10 +313,10 @@ class AssociationsJoinModelTest &lt; Test::Unit::TestCase
   end
 
   def test_has_many_polymorphic
-    assert_raises ActiveRecord::HasManyThroughAssociationPolymorphicError do
+    assert_raise ActiveRecord::HasManyThroughAssociationPolymorphicError do
       assert_equal posts(:welcome, :thinking), tags(:general).taggables
     end
-    assert_raises ActiveRecord::EagerLoadPolymorphicError do
+    assert_raise ActiveRecord::EagerLoadPolymorphicError do
       assert_equal posts(:welcome, :thinking), tags(:general).taggings.find(:all, :include =&gt; :taggable)
     end
   end</diff>
      <filename>activerecord/test/associations/join_model_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>dc901ced448179d9dfec924e22d8444b1a75265c</id>
    </parent>
  </parents>
  <author>
    <name>Jeremy Kemper</name>
    <email>jeremy@bitsweat.net</email>
  </author>
  <url>http://github.com/rails/rails/commit/8b5f4e474f30560da85f52dd64dc3b45d0338b93</url>
  <id>8b5f4e474f30560da85f52dd64dc3b45d0338b93</id>
  <committed-date>2007-12-22T03:26:03-08:00</committed-date>
  <authored-date>2007-12-22T03:26:03-08:00</authored-date>
  <message>Ruby 1.9 compat: fix warnings, shadowed block vars, and unitialized instance vars


git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8481 5ecf4fe2-1ee6-0310-87b1-e25e094e27de</message>
  <tree>0ba6fdc63093d9cc5549498d9f62238bea80a4cf</tree>
  <committer>
    <name>Jeremy Kemper</name>
    <email>jeremy@bitsweat.net</email>
  </committer>
</commit>
