mirror of
https://github.com/github/rails.git
synced 2026-04-04 03:00:58 -04:00
Add efficient #include? to AssociationCollection (for has_many/has_many :through/habtm). [stopdropandrew]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@9200 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
*SVN*
|
||||
|
||||
* Add efficient #include? to AssociationCollection (for has_many/has_many :through/habtm). [stopdropandrew]
|
||||
|
||||
* PostgreSQL: create_ and drop_database support. #9042 [ez, pedz, nicksieger]
|
||||
|
||||
* Ensure that validates_uniqueness_of works with with_scope. Closes #9235. [nik.wakelin, cavalle]
|
||||
|
||||
@@ -159,6 +159,11 @@ module ActiveRecord
|
||||
end
|
||||
end
|
||||
|
||||
def include?(record)
|
||||
return false unless record.is_a?(@reflection.klass)
|
||||
return @target.include?(record) if loaded?
|
||||
exists?(record)
|
||||
end
|
||||
|
||||
protected
|
||||
def method_missing(method, *args)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module ActiveRecord
|
||||
module Associations
|
||||
class HasManyThroughAssociation < AssociationProxy #:nodoc:
|
||||
class HasManyThroughAssociation < AssociationCollection #:nodoc:
|
||||
def initialize(owner, reflection)
|
||||
super
|
||||
reflection.check_validity!
|
||||
|
||||
@@ -639,7 +639,37 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
||||
assert_equal comments.first.post, comments[1].post
|
||||
end
|
||||
end
|
||||
|
||||
def test_has_many_through_include_uses_array_include_after_loaded
|
||||
david = authors(:david)
|
||||
category = david.categories.first
|
||||
|
||||
assert_no_queries do
|
||||
assert david.categories.loaded?
|
||||
assert david.categories.include?(category)
|
||||
end
|
||||
end
|
||||
|
||||
def test_has_many_through_include_checks_if_record_exists_if_target_not_loaded
|
||||
david = authors(:david)
|
||||
category = david.categories.first
|
||||
|
||||
david.reload
|
||||
assert ! david.categories.loaded?
|
||||
assert_queries(1) do
|
||||
assert david.categories.include?(category)
|
||||
end
|
||||
assert ! david.categories.loaded?
|
||||
end
|
||||
|
||||
def test_has_many_through_include_returns_false_for_non_matching_record_to_verify_scoping
|
||||
david = authors(:david)
|
||||
category = Category.create!(:name => 'Not Associated')
|
||||
|
||||
assert ! david.categories.loaded?
|
||||
assert ! david.categories.include?(category)
|
||||
end
|
||||
|
||||
private
|
||||
# create dynamic Post models to allow different dependency options
|
||||
def find_post_with_dependency(post_id, association, association_name, dependency)
|
||||
|
||||
@@ -1330,6 +1330,36 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
||||
assert_equal authors(:david).hello_post_comments, authors(:david).hello_post_comments_with_hash_conditions
|
||||
end
|
||||
|
||||
def test_include_uses_array_include_after_loaded
|
||||
firm = companies(:first_firm)
|
||||
client = firm.clients.first
|
||||
|
||||
assert_no_queries do
|
||||
assert firm.clients.loaded?
|
||||
assert firm.clients.include?(client)
|
||||
end
|
||||
end
|
||||
|
||||
def test_include_checks_if_record_exists_if_target_not_loaded
|
||||
firm = companies(:first_firm)
|
||||
client = firm.clients.first
|
||||
|
||||
firm.reload
|
||||
assert ! firm.clients.loaded?
|
||||
assert_queries(1) do
|
||||
assert firm.clients.include?(client)
|
||||
end
|
||||
assert ! firm.clients.loaded?
|
||||
end
|
||||
|
||||
def test_include_returns_false_for_non_matching_record_to_verify_scoping
|
||||
firm = companies(:first_firm)
|
||||
client = Client.create!(:name => 'Not Associated')
|
||||
|
||||
assert ! firm.clients.loaded?
|
||||
assert ! firm.clients.include?(client)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class BelongsToAssociationsTest < ActiveRecord::TestCase
|
||||
@@ -2046,6 +2076,36 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
||||
assert_equal developers(:david), active_record.developers.find(developers(:david).id), "Ruby find"
|
||||
end
|
||||
|
||||
def test_include_uses_array_include_after_loaded
|
||||
project = projects(:active_record)
|
||||
developer = project.developers.first
|
||||
|
||||
assert_no_queries do
|
||||
assert project.developers.loaded?
|
||||
assert project.developers.include?(developer)
|
||||
end
|
||||
end
|
||||
|
||||
def test_include_checks_if_record_exists_if_target_not_loaded
|
||||
project = projects(:active_record)
|
||||
developer = project.developers.first
|
||||
|
||||
project.reload
|
||||
assert ! project.developers.loaded?
|
||||
assert_queries(1) do
|
||||
assert project.developers.include?(developer)
|
||||
end
|
||||
assert ! project.developers.loaded?
|
||||
end
|
||||
|
||||
def test_include_returns_false_for_non_matching_record_to_verify_scoping
|
||||
project = projects(:active_record)
|
||||
developer = Developer.create :name => "Bryan", :salary => 50_000
|
||||
|
||||
assert ! project.developers.loaded?
|
||||
assert ! project.developers.include?(developer)
|
||||
end
|
||||
|
||||
def test_find_in_association_with_custom_finder_sql
|
||||
assert_equal developers(:david), projects(:active_record).developers_with_finder_sql.find(developers(:david).id), "SQL find"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user