From 98c085357e87ee49aec27d270f18502f2a062bef Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 28 Aug 2013 17:53:03 -0700 Subject: avoid extra empty array allocation --- .../associations/preloader/association.rb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'activerecord') diff --git a/activerecord/lib/active_record/associations/preloader/association.rb b/activerecord/lib/active_record/associations/preloader/association.rb index 39a1d022a4..3059bae76f 100644 --- a/activerecord/lib/active_record/associations/preloader/association.rb +++ b/activerecord/lib/active_record/associations/preloader/association.rb @@ -75,24 +75,24 @@ module ActiveRecord owners_map = owners_by_key owner_keys = owners_map.keys.compact - if klass.nil? || owner_keys.empty? - records = [] - else + # Each record may have multiple owners, and vice-versa + records_by_owner = Hash[owners.map { |owner| [owner, []] }] + + if klass && owner_keys.any? # Some databases impose a limit on the number of ids in a list (in Oracle it's 1000) # Make several smaller queries if necessary or make one query if the adapter supports it sliced = owner_keys.each_slice(klass.connection.in_clause_length || owner_keys.size) records = sliced.flat_map { |slice| records_for(slice) } - end - # Each record may have multiple owners, and vice-versa - records_by_owner = Hash[owners.map { |owner| [owner, []] }] - records.each do |record| - owner_key = owner_id_for records, record + records.each do |record| + owner_key = owner_id_for records, record - owners_map[owner_key].each do |owner| - records_by_owner[owner] << record + owners_map[owner_key].each do |owner| + records_by_owner[owner] << record + end end end + records_by_owner end -- cgit v1.2.3