aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
authorBen Woosley <ben.woosley@gmail.com>2015-10-23 16:13:36 -0500
committerBen Woosley <ben.woosley@gmail.com>2015-12-24 09:03:28 -0800
commitb42c3255bf22e54f459751d5370e8befc33e84ea (patch)
treec1ed70c11b2999af32f127e265c9de37a0ab1851 /activerecord/test
parent16a476e4f8f802774ae7c8dca2e59f4e672dc591 (diff)
downloadrails-b42c3255bf22e54f459751d5370e8befc33e84ea.tar.gz
rails-b42c3255bf22e54f459751d5370e8befc33e84ea.tar.bz2
rails-b42c3255bf22e54f459751d5370e8befc33e84ea.zip
Fix `first(limit)` to take advantage of `loaded?` records if available
I realized that `first(2)`, etc. was unnecessarily querying for the records when they were already preloaded. This was because `find_nth_with_limit` can not know which `@records` to return because it conflates the `offset` and `index` into a single variable, while the `@records` only needs the `index` itself to select the proper record. Because `find_nth` and `find_nth_with_limit` are public methods, I instead introduced a private method `find_nth_with_limit_and_offset` which is called internally and handles the `loaded?` checking. Once the `offset` argument is removed from `find_nth`, `find_nth_with_limit_and_offset` can be collapsed into `find_nth_with_limit`, with `offset` always equal to `offset_index`.
Diffstat (limited to 'activerecord/test')
-rw-r--r--activerecord/test/cases/relations_test.rb17
1 files changed, 14 insertions, 3 deletions
diff --git a/activerecord/test/cases/relations_test.rb b/activerecord/test/cases/relations_test.rb
index 7149c7d072..df0c2f1f92 100644
--- a/activerecord/test/cases/relations_test.rb
+++ b/activerecord/test/cases/relations_test.rb
@@ -111,10 +111,21 @@ class RelationTest < ActiveRecord::TestCase
def test_loaded_first
topics = Topic.all.order('id ASC')
+ topics.to_a # force load
- assert_queries(1) do
- topics.to_a # force load
- 2.times { assert_equal "The First Topic", topics.first.title }
+ assert_no_queries do
+ assert_equal "The First Topic", topics.first.title
+ end
+
+ assert topics.loaded?
+ end
+
+ def test_loaded_first_with_limit
+ topics = Topic.all.order('id ASC')
+ topics.to_a # force load
+
+ assert_no_queries do
+ assert_equal "The First Topic", topics.first(2).first.title
end
assert topics.loaded?