aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2013-08-28 17:53:03 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2013-08-28 17:53:03 -0700
commit98c085357e87ee49aec27d270f18502f2a062bef (patch)
treef3d97110ea6a16de0e2dc996001cfd8871d1069e /activerecord
parente7baa6624695d844e903193bcdda1b928bf61042 (diff)
downloadrails-98c085357e87ee49aec27d270f18502f2a062bef.tar.gz
rails-98c085357e87ee49aec27d270f18502f2a062bef.tar.bz2
rails-98c085357e87ee49aec27d270f18502f2a062bef.zip
avoid extra empty array allocation
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/associations/preloader/association.rb20
1 files changed, 10 insertions, 10 deletions
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