<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -11,9 +11,6 @@ module ActiveRecord
         reflection = create_has_many_reflection(association_id, options, &amp;extension)
 
         configure_dependency_for_has_many(reflection)
-
-        add_multiple_associated_validation_callbacks(reflection.name) unless options[:validate] == false
-        add_multiple_associated_save_callbacks(reflection.name)
         add_association_callbacks(reflection.name, reflection.options)
 
         if options[:through]
@@ -33,22 +30,20 @@ module ActiveRecord
 
       def collection_reader_method(reflection, association_proxy_class, options)
         define_method(reflection.name) do |*params|
-          ivar = &quot;@#{reflection.name}&quot;
-
           force_reload = params.first unless params.empty?
 
           association = if options[:cached]
             cache_read(reflection)
           else
-            instance_variable_get(ivar) if instance_variable_defined?(ivar)
+            association_instance_get(reflection.name)
           end
 
-          unless association.respond_to?(:loaded?)
+          unless association
             association = association_proxy_class.new(self, reflection)
             if options[:cached]
               cache_write(reflection, association)
             else
-              instance_variable_set(ivar, association)
+              association_instance_set(reflection.name, association)
             end
           end
 
@@ -79,8 +74,6 @@ module ActiveRecord
       def has_and_belongs_to_many(association_id, options = {}, &amp;extension) #:nodoc:
         reflection = create_has_and_belongs_to_many_reflection(association_id, options, &amp;extension)
 
-        add_multiple_associated_validation_callbacks(reflection.name) unless options[:validate] == false
-        add_multiple_associated_save_callbacks(reflection.name)
         collection_accessor_methods(reflection, HasAndBelongsToManyAssociation, options)
 
         # Don't use a before_destroy callback since users' before_destroy</diff>
      <filename>lib/activerecord/lib/active_record/associations.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,15 +4,10 @@ module ActiveRecord
   module Associations
     class AssociationProxy
       protected
-        def set_belongs_to_association_for(record)
+        alias_method :active_record_set_belongs_to_association_for, :set_belongs_to_association_for
+        def set_belongs_to_association_for_with_cache_expiration(record)
           reset_association_cache(record) if @reflection.options[:cached]
-
-          if @reflection.options[:as]
-            record[&quot;#{@reflection.options[:as]}_id&quot;]   = @owner.id unless @owner.new_record?
-            record[&quot;#{@reflection.options[:as]}_type&quot;] = @owner.class.base_class.name.to_s
-          else
-            record[@reflection.primary_key_name] = @owner.id unless @owner.new_record?
-          end
+          active_record_set_belongs_to_association_for(record)
         end
 
       private</diff>
      <filename>lib/activerecord/lib/active_record/associations/association_proxy.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,45 +1,11 @@
 module ActiveRecord
   module Associations
     class HasAndBelongsToManyAssociation &lt; AssociationCollection #:nodoc:
+      alias_method :active_record_insert_record, :insert_record
       def insert_record(record, force=true) #:nodoc:
-        if record.new_record?
-          if force
-            record.save!
-          else
-            return false unless record.save
-          end
+        returning result = active_record_insert_record_without_cache_expiration(record, force) do
+          @owner.send(:cache_delete, @reflection) if result &amp;&amp; @reflection.options[:cached]
         end
-
-        if @reflection.options[:insert_sql]
-          @owner.connection.insert(interpolate_sql(@reflection.options[:insert_sql], record))
-        else
-          columns = @owner.connection.columns(@reflection.options[:join_table], &quot;#{@reflection.options[:join_table]} Columns&quot;)
-
-          attributes = columns.inject({}) do |attrs, column|
-            case column.name.to_s
-              when @reflection.primary_key_name.to_s
-                attrs[column.name] = owner_quoted_id
-              when @reflection.association_foreign_key.to_s
-                attrs[column.name] = record.quoted_id
-              else
-                if record.has_attribute?(column.name)
-                  value = @owner.send(:quote_value, record[column.name], column)
-                  attrs[column.name] = value unless value.nil?
-                end
-            end
-            attrs
-          end
-
-          sql =
-            &quot;INSERT INTO #{@owner.connection.quote_table_name @reflection.options[:join_table]} (#{@owner.send(:quoted_column_names, attributes).join(', ')}) &quot; +
-            &quot;VALUES (#{attributes.values.join(', ')})&quot;
-
-          @owner.connection.insert(sql)
-        end
-
-        @owner.send(:cache_delete, @reflection) if @reflection.options[:cached]
-
-        return true
       end
     end
   end</diff>
      <filename>lib/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>9c5b5e1d0afabb973c0d7f9540a01228e15ab9b8</id>
    </parent>
  </parents>
  <author>
    <name>Luca Guidi</name>
    <email>guidi.luca@gmail.com</email>
  </author>
  <url>http://github.com/jodosha/cached-models/commit/66b602b0f3bd7d8b73f0c00c8fa18dfd52d8e51b</url>
  <id>66b602b0f3bd7d8b73f0c00c8fa18dfd52d8e51b</id>
  <committed-date>2009-08-12T06:33:57-07:00</committed-date>
  <authored-date>2009-08-12T06:33:57-07:00</authored-date>
  <message>Rails 2.3.3 compat [Gregg Kellogg]</message>
  <tree>ddca5344dfed6ac6f8fb41b02cb442e14e4c49e3</tree>
  <committer>
    <name>Luca Guidi</name>
    <email>guidi.luca@gmail.com</email>
  </committer>
</commit>
