diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2013-09-20 15:49:56 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2013-09-20 15:49:56 -0700 |
commit | ec7cc6aa176e94c79eba7a1b04360f13eaa328c0 (patch) | |
tree | 679624536c37f76d0bf5b9aeac071eb2e0ccdee7 /activerecord | |
parent | 31744e41f2c483dbb5d281cd9e170338c0ff55c9 (diff) | |
download | rails-ec7cc6aa176e94c79eba7a1b04360f13eaa328c0.tar.gz rails-ec7cc6aa176e94c79eba7a1b04360f13eaa328c0.tar.bz2 rails-ec7cc6aa176e94c79eba7a1b04360f13eaa328c0.zip |
access preloaders independently of model mutations
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/associations/preloader.rb | 24 |
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 |