提交 c4e1fdd9 编写于 作者: A Aaron Patterson

guarantee that `klass` is not nil inside the preloader objects

上级 e9d2ff69
...@@ -133,7 +133,7 @@ def preloaders_for_hash(association, records, scope) ...@@ -133,7 +133,7 @@ def preloaders_for_hash(association, records, scope)
def preloaders_for_one(association, records, scope) def preloaders_for_one(association, records, scope)
grouped_records(association, records).flat_map do |reflection, klasses| grouped_records(association, records).flat_map do |reflection, klasses|
klasses.map do |rhs_klass, rs| klasses.map do |rhs_klass, rs|
loader = preloader_for(reflection, rs).new(rhs_klass, rs, reflection, scope) loader = preloader_for(reflection, rs, rhs_klass).new(rhs_klass, rs, reflection, scope)
loader.run self loader.run self
loader loader
end end
...@@ -173,7 +173,7 @@ def association_klass(reflection, record) ...@@ -173,7 +173,7 @@ def association_klass(reflection, record)
end end
end end
class NullPreloader class AlreadyLoaded
attr_reader :owners, :reflection attr_reader :owners, :reflection
def initialize(klass, owners, reflection, preload_scope) def initialize(klass, owners, reflection, preload_scope)
...@@ -188,9 +188,16 @@ def preloaded_records ...@@ -188,9 +188,16 @@ def preloaded_records
end end
end end
def preloader_for(reflection, owners) class NullPreloader
def self.new(klass, owners, reflection, preload_scope); self; end
def self.run(preloader); end
end
def preloader_for(reflection, owners, rhs_klass)
return NullPreloader unless rhs_klass
if owners.first.association(reflection.name).loaded? if owners.first.association(reflection.name).loaded?
return NullPreloader return AlreadyLoaded
end end
case reflection.macro case reflection.macro
......
...@@ -86,7 +86,7 @@ def associated_records_by_owner(preloader) ...@@ -86,7 +86,7 @@ def associated_records_by_owner(preloader)
h[owner] = [] h[owner] = []
end end
if klass && owner_keys.any? if owner_keys.any?
# Some databases impose a limit on the number of ids in a list (in Oracle it's 1000) # Some databases impose a limit on the number of ids in a list (in Oracle it's 1000)
# Make several smaller queries if necessary or make one query if the adapter supports it # Make several smaller queries if necessary or make one query if the adapter supports it
sliced = owner_keys.each_slice(klass.connection.in_clause_length || owner_keys.size) sliced = owner_keys.each_slice(klass.connection.in_clause_length || owner_keys.size)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册