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

Changeset 9200

Show
Ignore:
Timestamp:
04/01/08 18:27:22 (3 months ago)
Author:
rick
Message:

Add efficient #include? to AssociationCollection (for has_many/has_many :through/habtm). [stopdropandrew]

Files:

Legend:

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

    r9182 r9200  
    11*SVN* 
     2 
     3* Add efficient #include? to AssociationCollection (for has_many/has_many :through/habtm).  [stopdropandrew] 
    24 
    35* PostgreSQL: create_ and drop_database support.  #9042 [ez, pedz, nicksieger] 
  • trunk/activerecord/lib/active_record/associations/association_collection.rb

    r9084 r9200  
    160160      end 
    161161 
     162      def include?(record) 
     163        return false unless record.is_a?(@reflection.klass) 
     164        return @target.include?(record) if loaded? 
     165        exists?(record) 
     166      end 
    162167 
    163168      protected 
  • trunk/activerecord/lib/active_record/associations/has_many_through_association.rb

    r9110 r9200  
    11module ActiveRecord 
    22  module Associations 
    3     class HasManyThroughAssociation < AssociationProxy #:nodoc: 
     3    class HasManyThroughAssociation < AssociationCollection #:nodoc: 
    44      def initialize(owner, reflection) 
    55        super 
  • trunk/activerecord/test/cases/associations_test.rb

    r9157 r9200  
    13311331  end 
    13321332 
     1333  def test_include_uses_array_include_after_loaded 
     1334    firm = companies(:first_firm) 
     1335    client = firm.clients.first 
     1336 
     1337    assert_no_queries do 
     1338      assert firm.clients.loaded? 
     1339      assert firm.clients.include?(client) 
     1340    end 
     1341  end 
     1342 
     1343  def test_include_checks_if_record_exists_if_target_not_loaded 
     1344    firm = companies(:first_firm) 
     1345    client = firm.clients.first 
     1346 
     1347    firm.reload 
     1348    assert ! firm.clients.loaded? 
     1349    assert_queries(1) do 
     1350      assert firm.clients.include?(client) 
     1351    end 
     1352    assert ! firm.clients.loaded? 
     1353  end 
     1354 
     1355  def test_include_returns_false_for_non_matching_record_to_verify_scoping 
     1356    firm = companies(:first_firm) 
     1357    client = Client.create!(:name => 'Not Associated') 
     1358 
     1359    assert ! firm.clients.loaded? 
     1360    assert ! firm.clients.include?(client) 
     1361  end 
     1362 
    13331363end 
    13341364 
     
    20472077  end 
    20482078 
     2079  def test_include_uses_array_include_after_loaded 
     2080    project = projects(:active_record) 
     2081    developer = project.developers.first 
     2082     
     2083    assert_no_queries do 
     2084      assert project.developers.loaded? 
     2085      assert project.developers.include?(developer) 
     2086    end 
     2087  end 
     2088   
     2089  def test_include_checks_if_record_exists_if_target_not_loaded 
     2090    project = projects(:active_record) 
     2091    developer = project.developers.first 
     2092 
     2093    project.reload 
     2094    assert ! project.developers.loaded? 
     2095    assert_queries(1) do 
     2096      assert project.developers.include?(developer) 
     2097    end 
     2098    assert ! project.developers.loaded? 
     2099  end 
     2100 
     2101  def test_include_returns_false_for_non_matching_record_to_verify_scoping 
     2102    project = projects(:active_record) 
     2103    developer = Developer.create :name => "Bryan", :salary => 50_000 
     2104 
     2105    assert ! project.developers.loaded? 
     2106    assert ! project.developers.include?(developer) 
     2107  end 
     2108 
    20492109  def test_find_in_association_with_custom_finder_sql 
    20502110    assert_equal developers(:david), projects(:active_record).developers_with_finder_sql.find(developers(:david).id), "SQL find" 
  • trunk/activerecord/test/cases/associations/join_model_test.rb

    r9096 r9200  
    640640    end 
    641641  end 
     642 
     643  def test_has_many_through_include_uses_array_include_after_loaded 
     644    david = authors(:david) 
     645    category = david.categories.first 
     646 
     647    assert_no_queries do 
     648      assert david.categories.loaded? 
     649      assert david.categories.include?(category) 
     650    end 
     651  end 
     652 
     653  def test_has_many_through_include_checks_if_record_exists_if_target_not_loaded 
     654    david = authors(:david) 
     655    category = david.categories.first 
     656 
     657    david.reload 
     658    assert ! david.categories.loaded? 
     659    assert_queries(1) do 
     660      assert david.categories.include?(category) 
     661    end 
     662    assert ! david.categories.loaded? 
     663  end 
    642664   
     665  def test_has_many_through_include_returns_false_for_non_matching_record_to_verify_scoping 
     666    david = authors(:david) 
     667    category = Category.create!(:name => 'Not Associated') 
     668 
     669    assert ! david.categories.loaded? 
     670    assert ! david.categories.include?(category) 
     671  end 
     672 
    643673  private 
    644674    # create dynamic Post models to allow different dependency options