Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #6485: polymorphic_sti_associations_rails21.patch

File polymorphic_sti_associations_rails21.patch, 7.3 kB (added by pawulonrails, 5 months ago)

Polymorphic_sti_associations_edge_v2.patch adjusted for Rails 2.1. I'm not Rails expert, so this patch may break things. But in my simple tests it worked.

  • vendor/rails/activerecord/lib/active_record/associations.rb

    old new  
    885885 
    886886              if association.updated? 
    887887                self["#{reflection.primary_key_name}"] = association.id 
    888                 self["#{reflection.options[:foreign_type]}"] = association.class.base_class.name.to_s 
     888                self["#{reflection.options[:foreign_type]}"] = association.class.name.to_s 
    889889              end 
    890890            end 
    891891          end 
     
    12601260            # Add polymorphic type if the :as option is present 
    12611261            dependent_conditions = [] 
    12621262            dependent_conditions << "#{reflection.primary_key_name} = \#{record.quoted_id}" 
    1263             dependent_conditions << "#{reflection.options[:as]}_type = '#{base_class.name}'" if reflection.options[:as] 
     1263            dependent_conditions << "#{reflection.options[:as]}_type = '#{name}'" if reflection.options[:as] 
    12641264            dependent_conditions << sanitize_sql(reflection.options[:conditions]) if reflection.options[:conditions] 
    12651265            dependent_conditions = dependent_conditions.collect {|where| "(#{where})" }.join(" AND ") 
    12661266 
     
    18301830                        jt_as_extra = " AND %s.%s = %s" % [ 
    18311831                          connection.quote_table_name(aliased_join_table_name), 
    18321832                          connection.quote_column_name(through_reflection.options[:as].to_s + '_type'), 
    1833                           klass.quote_value(parent.active_record.base_class.name) 
     1833                          klass.quote_value(parent.active_record.name) 
    18341834                        ] 
    18351835                      else 
    18361836                        jt_foreign_key = through_reflection.primary_key_name 
     
    18441844                          as_extra    = " AND %s.%s = %s" % [ 
    18451845                            connection.quote_table_name(aliased_table_name), 
    18461846                            connection.quote_column_name("#{source_reflection.options[:as]}_type"), 
    1847                             klass.quote_value(source_reflection.active_record.base_class.name) 
     1847                            klass.quote_value(source_reflection.active_record.name) 
    18481848                          ] 
    18491849                        else 
    18501850                          first_key   = through_reflection.klass.base_class.to_s.foreign_key 
     
    18971897                        parent.primary_key, 
    18981898                        connection.quote_table_name(aliased_table_name), 
    18991899                        "#{reflection.options[:as]}_type", 
    1900                         klass.quote_value(parent.active_record.base_class.name) 
     1900                        klass.quote_value(parent.active_record.name) 
    19011901                      ] 
    19021902                    else 
    19031903                      foreign_key = options[:foreign_key] || reflection.active_record.name.foreign_key 
  • vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb

    old new  
    146146        def set_belongs_to_association_for(record) 
    147147          if @reflection.options[:as] 
    148148            record["#{@reflection.options[:as]}_id"]   = @owner.id unless @owner.new_record? 
    149             record["#{@reflection.options[:as]}_type"] = @owner.class.base_class.name.to_s 
     149            record["#{@reflection.options[:as]}_type"] = @owner.class.name.to_s 
    150150          else 
    151151            record[@reflection.primary_key_name] = @owner.id unless @owner.new_record? 
    152152          end 
  • vendor/rails/activerecord/lib/active_record/associations/has_many_association.rb

    old new  
    7777            when @reflection.options[:as] 
    7878              @finder_sql =  
    7979                "#{@reflection.quoted_table_name}.#{@reflection.options[:as]}_id = #{@owner.quoted_id} AND " + 
    80                 "#{@reflection.quoted_table_name}.#{@reflection.options[:as]}_type = #{@owner.class.quote_value(@owner.class.base_class.name.to_s)}" 
     80                "#{@reflection.quoted_table_name}.#{@reflection.options[:as]}_type = #{@owner.class.quote_value(@owner.class.name.to_s)}" 
    8181              @finder_sql << " AND (#{conditions})" if conditions 
    8282             
    8383            else 
  • vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb

    old new  
    8787        def construct_owner_attributes(reflection) 
    8888          if as = reflection.options[:as] 
    8989            { "#{as}_id" => @owner.id, 
    90               "#{as}_type" => @owner.class.base_class.name.to_s } 
     90              "#{as}_type" => @owner.class.name.to_s } 
    9191          else 
    9292            { reflection.primary_key_name => @owner.id } 
    9393          end 
     
    9999          raise ActiveRecord::HasManyThroughCantAssociateThroughHasManyReflection.new(@owner, @reflection) if @reflection.source_reflection.macro == :has_many 
    100100          join_attributes = construct_owner_attributes(@reflection.through_reflection).merge(@reflection.source_reflection.primary_key_name => associate.id) 
    101101          if @reflection.options[:source_type] 
    102             join_attributes.merge!(@reflection.source_reflection.options[:foreign_type] => associate.class.base_class.name.to_s) 
     102            join_attributes.merge!(@reflection.source_reflection.options[:foreign_type] => associate.class.name.to_s) 
    103103          end 
    104104          join_attributes 
    105105        end 
     
    109109          if as = reflection.options[:as] 
    110110            { "#{as}_id" => @owner.quoted_id, 
    111111              "#{as}_type" => reflection.klass.quote_value( 
    112                 @owner.class.base_class.name.to_s, 
     112                @owner.class.name.to_s, 
    113113                reflection.klass.columns_hash["#{as}_type"]) } 
    114114          else 
    115115            { reflection.primary_key_name => @owner.quoted_id } 
  • vendor/rails/activerecord/lib/active_record/associations/has_one_association.rb

    old new  
    6464            when @reflection.options[:as] 
    6565              @finder_sql =  
    6666                "#{@reflection.quoted_table_name}.#{@reflection.options[:as]}_id = #{@owner.quoted_id} AND " + 
    67                 "#{@reflection.quoted_table_name}.#{@reflection.options[:as]}_type = #{@owner.class.quote_value(@owner.class.base_class.name.to_s)}" 
     67                "#{@reflection.quoted_table_name}.#{@reflection.options[:as]}_type = #{@owner.class.quote_value(@owner.class.name.to_s)}" 
    6868            else 
    6969              @finder_sql = "#{@reflection.quoted_table_name}.#{@reflection.primary_key_name} = #{@owner.quoted_id}" 
    7070          end