Changeset 9229
- Timestamp:
- 04/05/08 16:25:48 (8 months ago)
- Files:
-
- trunk/activerecord/CHANGELOG (modified) (1 diff)
- trunk/activerecord/lib/active_record/associations/association_collection.rb (modified) (1 diff)
- trunk/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb (modified) (2 diffs)
- trunk/activerecord/lib/active_record/associations/has_many_association.rb (modified) (1 diff)
- trunk/activerecord/test/cases/associations_test.rb (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/activerecord/CHANGELOG
r9226 r9229 1 1 *SVN* 2 3 * Ensure HABTM#create and HABTM#build do not load entire association. [Pratik] 2 4 3 5 * Improve documentation. [Xavier Noria, Jack Danger Canty, leethal] trunk/activerecord/lib/active_record/associations/association_collection.rb
r9225 r9229 167 167 168 168 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 169 188 def method_missing(method, *args) 170 189 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 8 8 9 9 def build(attributes = {}) 10 load_target11 10 build_record(attributes) 12 11 end … … 155 154 attributes.collect { |attr| create(attr) } 156 155 else 157 load_target158 156 build_record(attributes, &block) 159 157 end trunk/activerecord/lib/active_record/associations/has_many_association.rb
r9084 r9229 69 69 70 70 protected 71 def load_target72 if !@owner.new_record? || foreign_key_present73 begin74 if !loaded?75 if @target.is_a?(Array) && @target.any?76 @target = (find_target + @target).uniq77 else78 @target = find_target79 end80 end81 rescue ActiveRecord::RecordNotFound82 reset83 end84 end85 86 loaded if target87 target88 end89 90 71 def count_records 91 72 count = if has_cached_counter? trunk/activerecord/test/cases/associations_test.rb
r9200 r9229 873 873 874 874 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 876 879 assert_equal "Another Client", new_client.name 877 880 assert new_client.new_record? 878 assert_equal new_client, compan ies(:first_firm).clients_of_firm.last879 assert companies(:first_firm).save881 assert_equal new_client, company.clients_of_firm.last 882 assert_queries(2) { assert company.save } 880 883 assert !new_client.new_record? 881 assert_equal 2, compan ies(:first_firm).clients_of_firm(true).size884 assert_equal 2, company.clients_of_firm(true).size 882 885 end 883 886 884 887 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 886 891 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 890 894 end 891 895 … … 1909 1913 def test_build 1910 1914 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 1912 1918 assert_equal devel.projects.last, proj 1919 assert devel.projects.loaded? 1920 1913 1921 assert proj.new_record? 1914 1922 devel.save … … 1934 1942 devel = Developer.find(1) 1935 1943 proj = devel.projects.create("name" => "Projekt") 1944 assert !devel.projects.loaded? 1945 1936 1946 assert_equal devel.projects.last, proj 1947 assert devel.projects.loaded? 1948 1937 1949 assert !proj.new_record? 1938 1950 assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated … … 1965 1977 1966 1978 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 1971 1985 end 1972 1986