From ec7cc6aa176e94c79eba7a1b04360f13eaa328c0 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 20 Sep 2013 15:49:56 -0700 Subject: access preloaders independently of model mutations --- .../lib/active_record/associations/preloader.rb | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'activerecord/lib') 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 -- cgit v1.2.3