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

Changeset 9229

Show
Ignore:
Timestamp:
04/05/08 16:25:48 (5 months ago)
Author:
pratik
Message:

Ensure HABTM#create and HABTM#build do not load entire association. [Pratik]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activerecord/CHANGELOG

    r9226 r9229  
    11*SVN* 
     2 
     3* Ensure HABTM#create and HABTM#build do not load entire association. [Pratik] 
    24 
    35* Improve documentation. [Xavier Noria, Jack Danger Canty, leethal] 
  • trunk/activerecord/lib/active_record/associations/association_collection.rb

    r9225 r9229  
    167167 
    168168      protected 
     169        def load_target 
     170          if !@owner.new_record? || foreign_key_present 
     171            begin 
     172              if !loaded? 
     173                if @target.is_a?(Array) && @target.any? 
     174                  @target = find_target + @target.find_all {|t| t.new_record? } 
     175                else 
     176                  @target = find_target 
     177                end 
     178              end 
     179            rescue ActiveRecord::RecordNotFound 
     180              reset 
     181            end 
     182          end 
     183 
     184          loaded if target 
     185          target 
     186        end 
     187         
    169188        def method_missing(method, *args) 
    170189          if @target.respond_to?(method) || (!@reflection.klass.respond_to?(method) && Class.respond_to?(method)) 
  • trunk/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb

    r9224 r9229  
    88 
    99      def build(attributes = {}) 
    10         load_target 
    1110        build_record(attributes) 
    1211      end 
     
    155154            attributes.collect { |attr| create(attr) } 
    156155          else 
    157             load_target 
    158156            build_record(attributes, &block) 
    159157          end 
  • trunk/activerecord/lib/active_record/associations/has_many_association.rb

    r9084 r9229  
    6969 
    7070      protected 
    71         def load_target 
    72           if !@owner.new_record? || foreign_key_present 
    73             begin 
    74               if !loaded? 
    75                 if @target.is_a?(Array) && @target.any? 
    76                   @target = (find_target + @target).uniq 
    77                 else 
    78                   @target = find_target 
    79                 end 
    80               end 
    81             rescue ActiveRecord::RecordNotFound 
    82               reset 
    83             end 
    84           end 
    85  
    86           loaded if target 
    87           target 
    88         end 
    89  
    9071        def count_records 
    9172          count = if has_cached_counter? 
  • trunk/activerecord/test/cases/associations_test.rb

    r9200 r9229  
    873873 
    874874  def test_build 
    875     new_client = companies(:first_firm).clients_of_firm.build("name" => "Another Client") 
     875    company = companies(:first_firm) 
     876    new_client = assert_no_queries { company.clients_of_firm.build("name" => "Another Client") } 
     877    assert !company.clients_of_firm.loaded? 
     878     
    876879    assert_equal "Another Client", new_client.name 
    877880    assert new_client.new_record? 
    878     assert_equal new_client, companies(:first_firm).clients_of_firm.last 
    879     assert companies(:first_firm).save 
     881    assert_equal new_client, company.clients_of_firm.last 
     882    assert_queries(2) { assert company.save } 
    880883    assert !new_client.new_record? 
    881     assert_equal 2, companies(:first_firm).clients_of_firm(true).size 
     884    assert_equal 2, company.clients_of_firm(true).size 
    882885  end 
    883886 
    884887  def test_build_many 
    885     new_clients = companies(:first_firm).clients_of_firm.build([{"name" => "Another Client"}, {"name" => "Another Client II"}]) 
     888    company = companies(:first_firm) 
     889    new_clients = assert_no_queries { company.clients_of_firm.build([{"name" => "Another Client"}, {"name" => "Another Client II"}]) } 
     890     
    886891    assert_equal 2, new_clients.size 
    887  
    888     assert companies(:first_firm).save 
    889     assert_equal 3, companies(:first_firm).clients_of_firm(true).size 
     892    assert_queries(3) { assert company.save } 
     893    assert_equal 3, company.clients_of_firm(true).size 
    890894  end 
    891895 
     
    19091913  def test_build 
    19101914    devel = Developer.find(1) 
    1911     proj = devel.projects.build("name" => "Projekt") 
     1915    proj = assert_no_queries { devel.projects.build("name" => "Projekt") } 
     1916    assert !devel.projects.loaded? 
     1917     
    19121918    assert_equal devel.projects.last, proj 
     1919    assert devel.projects.loaded? 
     1920     
    19131921    assert proj.new_record? 
    19141922    devel.save 
     
    19341942    devel = Developer.find(1) 
    19351943    proj = devel.projects.create("name" => "Projekt") 
     1944    assert !devel.projects.loaded? 
     1945     
    19361946    assert_equal devel.projects.last, proj 
     1947    assert devel.projects.loaded? 
     1948     
    19371949    assert !proj.new_record? 
    19381950    assert_equal Developer.find(1).projects.sort_by(&:id).last, proj  # prove join table is updated 
     
    19651977 
    19661978  def test_uniq_after_the_fact 
    1967     developers(:jamis).projects << projects(:active_record) 
    1968     developers(:jamis).projects << projects(:active_record) 
    1969     assert_equal 3, developers(:jamis).projects.size 
    1970     assert_equal 1, developers(:jamis).projects.uniq.size 
     1979    dev = developers(:jamis) 
     1980    dev.projects << projects(:active_record) 
     1981    dev.projects << projects(:active_record) 
     1982     
     1983    assert_equal 3, dev.projects.size 
     1984    assert_equal 1, dev.projects.uniq.size 
    19711985  end 
    19721986