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

Ticket #1391: has_many_association.patch

File has_many_association.patch, 2.1 kB (added by wishdev@gmail.com, 3 years ago)
  • activerecord/lib/active_record/associations/has_many_association.rb

    old new  
    122122          if @options[:dependent] 
    123123            records.each { |r| r.destroy } 
    124124          else 
    125             ids = quoted_record_ids(records) 
    126             @association_class.update_all( 
    127               "#{@association_class_primary_key_name} = NULL",  
    128               "#{@association_class_primary_key_name} = #{@owner.quoted_id} AND #{@association_class.primary_key} IN (#{ids})" 
    129             ) 
    130           end 
    131         end 
     125            ids = quoted_record_ids(records) 
     126              conditions = "#{@association_class_primary_key_name} " 
     127              if @owner.quoted_id == "NULL" 
     128                conditions << "IS NULL" 
     129              else 
     130                conditions << "= #{@owner.quoted_id}" 
     131              end 
     132              conditions << " AND (" 
     133              null_ids = ids[1] 
     134              if (null_ids) 
     135                conditions << "#{@association_class.primary_key} IS NULL" 
     136                if ids[0].length > 0 
     137                  conditions << " OR " 
     138                end 
     139              end 
     140              if ids[0].length > 0 
     141                conditions << "#{@association_class.primary_key} IN (#{ids[0]})" 
     142              end 
     143              conditions << ")" 
     144            @association_class.update_all("#{@association_class_primary_key_name} IS NULL", conditions) 
     145          end 
     146        end 
    132147 
    133148        def target_obsolete? 
    134149          false 
     
    138153          if @options[:finder_sql] 
    139154            @finder_sql = interpolate_sql(@options[:finder_sql]) 
    140155          else 
    141             @finder_sql = "#{@association_class.table_name}.#{@association_class_primary_key_name} = #{@owner.quoted_id}" 
    142             @finder_sql << " AND #{interpolate_sql(@conditions)}" if @conditions 
     156            @finder_sql = "#{@association_class_primary_key_name} = #{@owner.quoted_id}" 
     157              @finder_sql = "#{@association_class.table_name}.#{@association_class_primary_key_name}" 
     158              if @owner.quoted_id == "NULL" 
     159                @finder_sql << " IS NULL" 
     160              else 
     161                @finder_sql << " = #{@owner.quoted_id}" 
     162              end 
     163            @finder_sql << " AND #{interpolate_sql(@conditions)}" if @conditions 
    143164          end 
    144165 
    145166          if @options[:counter_sql]