From 6e5a2cb9519aab568ea0cfea2f42364de8ccf655 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 23 Sep 2013 16:46:48 -0700 Subject: remove state from the preloader --- .../lib/active_record/associations/preloader.rb | 24 +++++++--------------- .../associations/preloader/through_association.rb | 19 ++++++++--------- activerecord/lib/active_record/relation.rb | 3 ++- 3 files changed, 18 insertions(+), 28 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/associations/preloader.rb b/activerecord/lib/active_record/associations/preloader.rb index c31c742bf0..e8abea3bcb 100644 --- a/activerecord/lib/active_record/associations/preloader.rb +++ b/activerecord/lib/active_record/associations/preloader.rb @@ -46,8 +46,6 @@ module ActiveRecord autoload :BelongsTo, 'active_record/associations/preloader/belongs_to' end - attr_reader :records, :associations, :preload_scope, :model - # Eager loads the named associations for the given Active Record record(s). # # In this description, 'association name' shall refer to the name passed @@ -82,28 +80,20 @@ module ActiveRecord # [ :books, :author ] # { author: :avatar } # [ :books, { author: :avatar } ] - def initialize(records, associations, preload_scope = nil) - @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 - preloaders.each(&:run) - end - - def preloaders - return @preloaders if @preloaders + def preload(records, associations, preload_scope = nil) + records = Array.wrap(records).compact.uniq + associations = Array.wrap(associations) + preload_scope = preload_scope || NULL_RELATION if records.empty? - @preloaders = [] + [] else - @preloaders = associations.flat_map { |association| + associations.flat_map { |association| preloaders_on association, records, preload_scope - } + }.each(&:run) end end diff --git a/activerecord/lib/active_record/associations/preloader/through_association.rb b/activerecord/lib/active_record/associations/preloader/through_association.rb index 7849810151..be3e179543 100644 --- a/activerecord/lib/active_record/associations/preloader/through_association.rb +++ b/activerecord/lib/active_record/associations/preloader/through_association.rb @@ -16,10 +16,10 @@ module ActiveRecord return @associated_records_by_owner if @associated_records_by_owner - left_loader = Preloader.new(owners, - through_reflection.name, - through_scope) - left_loader.run + left_loader = Preloader.new + left_loader.preload(owners, + through_reflection.name, + through_scope) should_reset = (through_scope != through_reflection.klass.unscoped) || (reflection.options[:source_type] && through_reflection.collection?) @@ -37,13 +37,12 @@ module ActiveRecord middle_records = through_records.map { |(_,rec,_)| rec }.flatten - preloader = Preloader.new(middle_records, - source_reflection.name, - reflection_scope) + preloader = Preloader.new + preloaders = preloader.preload(middle_records, + source_reflection.name, + reflection_scope) - preloader.run - - middle_to_pl = preloader.preloaders.each_with_object({}) do |pl,h| + middle_to_pl = preloaders.each_with_object({}) do |pl,h| pl.owners.each { |middle| h[middle] = pl } diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb index 4e86e905ed..efa8cf1c42 100644 --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -600,7 +600,8 @@ module ActiveRecord preload = preload_values preload += includes_values unless eager_loading? preload.each do |associations| - ActiveRecord::Associations::Preloader.new(@records, associations).run + pl = ActiveRecord::Associations::Preloader.new + pl.preload @records, associations end @records.each { |record| record.readonly! } if readonly_value -- cgit v1.2.3