Skip to content
Browse files

Merge pull request #11051 from neerajdotname/10509f

do not load all child records for inverse case
  • Loading branch information...
2 parents cbc2e79 + 82882d4 commit ecdce2e105280fcb367be8a809f8ff24a719a4f8 @jonleighton jonleighton committed
View
16 activerecord/CHANGELOG.md
@@ -1,3 +1,19 @@
+* Do not load all child records for inverse case.
+
+ currently `post.comments.find(Comment.first.id)` would load all
+ comments for the given post to set the inverse association.
+
+ This has a huge performance penalty. Because if post has 100k
+ records and all these 100k records would be loaded in memory
+ even though the comment id was supplied.
+
+ Fix is to use in-memory records only if loaded? is true. Otherwise
+ load the records using full sql.
+
+ Fixes #10509.
+
+ *Neeraj Singh*
+
* `inspect` on Active Record model classes does not initiate a
new connection. This means that calling `inspect`, when the
database is missing, will no longer raise an exception.
View
2 activerecord/lib/active_record/associations/collection_association.rb
@@ -81,7 +81,7 @@ def find(*args)
else
if options[:finder_sql]
find_by_scan(*args)
- elsif options[:inverse_of]
+ elsif options[:inverse_of] && loaded?
args = args.flatten
raise RecordNotFound, "Couldn't find #{scope.klass.name} without an ID" if args.blank?
View
8 activerecord/test/cases/associations/inverse_associations_test.rb
@@ -401,6 +401,14 @@ def test_parent_instance_should_find_child_instance_using_child_instance_id_when
assert_equal man.name, man.interests.find(interest.id).man.name, "The name of the man should match after the child name is changed"
end
+ def test_find_on_child_instance_with_id_should_not_load_all_child_records
+ man = Man.create!
+ interest = Interest.create!(man: man)
+
+ man.interests.find(interest.id)
+ refute man.interests.loaded?
+ end
+
def test_raise_record_not_found_error_when_invalid_ids_are_passed
# delete all interest records to ensure that hard coded invalid_id(s)
# are indeed invalid.

0 comments on commit ecdce2e

Please sign in to comment.
Something went wrong with that request. Please try again.