diff --git a/activerecord/lib/active_record/associations/preloader.rb b/activerecord/lib/active_record/associations/preloader.rb index 8a975468f24fd8a175db388db87bf3fe61db22ab..9f03d6036844abc6377b5b7149e33c0d7e55b9aa 100644 --- a/activerecord/lib/active_record/associations/preloader.rb +++ b/activerecord/lib/active_record/associations/preloader.rb @@ -174,14 +174,18 @@ def association_klass(reflection, record) end class NullPreloader - attr_reader :owners + attr_reader :owners, :reflection def initialize(klass, owners, reflection, preload_scope) @owners = owners + @reflection = reflection end def run(preloader); end - def loaded?; false; end + + def preloaded_records + owners.flat_map { |owner| owner.read_attribute reflection.name } + end end def preloader_for(reflection, owners) diff --git a/activerecord/lib/active_record/associations/preloader/association.rb b/activerecord/lib/active_record/associations/preloader/association.rb index cdf4a2734127364c5565bb4e50341ccd9c6fddb2..d02384e221d7b5cb68e12132b7f1416ec0228936 100644 --- a/activerecord/lib/active_record/associations/preloader/association.rb +++ b/activerecord/lib/active_record/associations/preloader/association.rb @@ -17,7 +17,6 @@ def initialize(klass, owners, reflection, preload_scope) @owners_by_key = nil @type_caster = IDENTITY_CASTER @associated_records_by_owner = nil - @loaded = false end def run(preloader) @@ -74,15 +73,9 @@ def preloaded_records @associated_records_by_owner.values.flatten end - def loaded? - @loaded - end - private def associated_records_by_owner(preloader) - @loaded = true - return @associated_records_by_owner if @associated_records_by_owner owners_map = owners_by_key diff --git a/activerecord/lib/active_record/associations/preloader/through_association.rb b/activerecord/lib/active_record/associations/preloader/through_association.rb index 0c0501fd589ae771bc3225376d737f38d5080c97..15fdba51f38312d0cb5c56132a7cfd6c89ee857f 100644 --- a/activerecord/lib/active_record/associations/preloader/through_association.rb +++ b/activerecord/lib/active_record/associations/preloader/through_association.rb @@ -12,8 +12,6 @@ def source_reflection end def associated_records_by_owner(preloader) - @loaded = true - return @associated_records_by_owner if @associated_records_by_owner preloader.preload(owners, @@ -54,7 +52,7 @@ def associated_records_by_owner(preloader) r.send(source_reflection.name) }.compact - if pl && pl.loaded? + if pl loaded_records = pl.preloaded_records i = 0 record_index = loaded_records.each_with_object({}) { |r,indexes|