diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index af723c61bd5f3d050683e70e1cca3e5333c695a4..f1d51b9de1b6ac400cca76b43fc81128d6a1b111 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,10 +1,5 @@ -<<<<<<< HEAD -* `find_in_batches`, `find_each` now +* `find_in_batches`, `find_each`, `Result#each` and `Enumerable#index_by` now return an `Enumerator` that can calculate its size. -======= -* `find_in_batches`, `find_each`, `Result#each` now returns an `Enumerator` - that can calculate its size. ->>>>>>> 5863938... Return sized enumerator from Result#each See also #13938. diff --git a/activesupport/lib/active_support/core_ext/enumerable.rb b/activesupport/lib/active_support/core_ext/enumerable.rb index a2dec41c8782e5f007e6da2494113e945e9b4288..1343beb87abfbb3457aa542d361c3e53350ee078 100644 --- a/activesupport/lib/active_support/core_ext/enumerable.rb +++ b/activesupport/lib/active_support/core_ext/enumerable.rb @@ -35,7 +35,7 @@ def index_by if block_given? Hash[map { |elem| [yield(elem), elem] }] else - to_enum(:index_by) { size } + to_enum(:index_by) { size if respond_to?(:size) } end end diff --git a/activesupport/test/core_ext/enumerable_test.rb b/activesupport/test/core_ext/enumerable_test.rb index 6b3e8364c52eb675683b3c9a0e96ad2606b05c3b..6fcf6e874319ccfdd0a1b7e96922c55a4927fa57 100644 --- a/activesupport/test/core_ext/enumerable_test.rb +++ b/activesupport/test/core_ext/enumerable_test.rb @@ -73,6 +73,10 @@ def test_index_by assert_equal({ 5 => Payment.new(5), 15 => Payment.new(15), 10 => Payment.new(10) }, payments.index_by { |p| p.price }) assert_equal Enumerator, payments.index_by.class + if Enumerator.method_defined? :size + assert_equal nil, payments.index_by.size + assert_equal 42, (1..42).index_by.size + end assert_equal({ 5 => Payment.new(5), 15 => Payment.new(15), 10 => Payment.new(10) }, payments.index_by.each { |p| p.price }) end