aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2013-09-20 15:49:56 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2013-09-20 15:49:56 -0700
commitec7cc6aa176e94c79eba7a1b04360f13eaa328c0 (patch)
tree679624536c37f76d0bf5b9aeac071eb2e0ccdee7 /activerecord/lib
parent31744e41f2c483dbb5d281cd9e170338c0ff55c9 (diff)
downloadrails-ec7cc6aa176e94c79eba7a1b04360f13eaa328c0.tar.gz
rails-ec7cc6aa176e94c79eba7a1b04360f13eaa328c0.tar.bz2
rails-ec7cc6aa176e94c79eba7a1b04360f13eaa328c0.zip
access preloaders independently of model mutations
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/associations/preloader.rb24
1 files changed, 12 insertions, 12 deletions
diff --git a/activerecord/lib/active_record/associations/preloader.rb b/activerecord/lib/active_record/associations/preloader.rb
index 274a3352fc..3ca07498c5 100644
--- a/activerecord/lib/active_record/associations/preloader.rb
+++ b/activerecord/lib/active_record/associations/preloader.rb
@@ -86,24 +86,29 @@ module ActiveRecord
@records = Array.wrap(records).compact.uniq
@associations = Array.wrap(associations)
@preload_scope = preload_scope || NULL_RELATION
+ @preloaders = nil
end
NULL_RELATION = Struct.new(:values).new({})
def run
- run_preload associations, records
+ preloaders.each(&:run)
end
- private
+ def preloaders
+ return @preloaders if @preloaders
- def run_preload(associations, records)
- unless records.empty?
- associations.flat_map { |association|
+ if records.empty?
+ @preloaders = []
+ else
+ @preloaders = associations.flat_map { |association|
preload(association, records)
- }.each(&:run)
+ }
end
end
+ private
+
def preload(association, records)
case association
when Hash
@@ -123,12 +128,7 @@ module ActiveRecord
loaders = preloaders_for_one parent, records
recs = loaders.flat_map(&:target_records).uniq
- lls = Array.wrap(child).flat_map { |assoc| preload assoc, recs }
- loaders + lls
- end
-
- def preload_hash(association, records)
- preloaders_for_hash(association, records).each(&:run)
+ loaders.concat Array.wrap(child).flat_map { |assoc| preload assoc, recs }
end
# Not all records have the same class, so group then preload group on the reflection