@@ -98,26 +98,30 @@ def preload(records, associations, preload_scope = nil)
9898 private
9999
100100 # Loads all the given data into +records+ for the +association+.
101- def preloaders_on ( association , records , scope )
101+ def preloaders_on ( association , records , scope , polymorphic_parent = false )
102102 case association
103103 when Hash
104- preloaders_for_hash ( association , records , scope )
104+ preloaders_for_hash ( association , records , scope , polymorphic_parent )
105105 when Symbol
106- preloaders_for_one ( association , records , scope )
106+ preloaders_for_one ( association , records , scope , polymorphic_parent )
107107 when String
108- preloaders_for_one ( association . to_sym , records , scope )
108+ preloaders_for_one ( association . to_sym , records , scope , polymorphic_parent )
109109 else
110110 raise ArgumentError , "#{ association . inspect } was not recognized for preload"
111111 end
112112 end
113113
114- def preloaders_for_hash ( association , records , scope )
114+ def preloaders_for_hash ( association , records , scope , polymorphic_parent )
115115 association . flat_map { |parent , child |
116- loaders = preloaders_for_one parent , records , scope
116+ loaders = preloaders_for_one parent , records , scope , polymorphic_parent
117117
118118 recs = loaders . flat_map ( &:preloaded_records ) . uniq
119+
120+ reflection = records . first . class . _reflect_on_association ( parent )
121+ polymorphic_parent = reflection && reflection . options [ :polymorphic ]
122+
119123 loaders . concat Array . wrap ( child ) . flat_map { |assoc |
120- preloaders_on assoc , recs , scope
124+ preloaders_on assoc , recs , scope , polymorphic_parent
121125 }
122126 loaders
123127 }
@@ -135,8 +139,8 @@ def preloaders_for_hash(association, records, scope)
135139 # Additionally, polymorphic belongs_to associations can have multiple associated
136140 # classes, depending on the polymorphic_type field. So we group by the classes as
137141 # well.
138- def preloaders_for_one ( association , records , scope )
139- grouped_records ( association , records ) . flat_map do |reflection , klasses |
142+ def preloaders_for_one ( association , records , scope , polymorphic_parent )
143+ grouped_records ( association , records , polymorphic_parent ) . flat_map do |reflection , klasses |
140144 klasses . map do |rhs_klass , rs |
141145 loader = preloader_for ( reflection , rs ) . new ( rhs_klass , rs , reflection , scope )
142146 loader . run self
@@ -145,10 +149,11 @@ def preloaders_for_one(association, records, scope)
145149 end
146150 end
147151
148- def grouped_records ( association , records )
152+ def grouped_records ( association , records , polymorphic_parent )
149153 h = { }
150154 records . each do |record |
151155 next unless record
156+ next if polymorphic_parent && !record . class . _reflect_on_association ( association )
152157 assoc = record . association ( association )
153158 next unless assoc . klass
154159 klasses = h [ assoc . reflection ] ||= { }
0 commit comments