提交 6f9ea581 编写于 作者: A Aaron Patterson

cache associated target records hash

上级 99568a7a
......@@ -16,7 +16,7 @@ def initialize(klass, owners, reflection, preload_scope)
@scope = nil
@owners_by_key = nil
@type_caster = IDENTITY_CASTER
@target_records = nil
@associated_records_by_owner = nil
end
def run
......@@ -77,21 +77,9 @@ def target_records
private
def lhs_records
return @target_records if @target_records
owners_map = owners_by_key
owner_keys = owners_map.keys.compact
sliced = owner_keys.each_slice(klass.connection.in_clause_length || owner_keys.size)
@target_records = sliced.flat_map { |slice|
records = records_for(slice)
set_type_caster records, association_key_name
records
}
end
def associated_records_by_owner
return @associated_records_by_owner if @associated_records_by_owner
owners_map = owners_by_key
owner_keys = owners_map.keys.compact
......@@ -101,8 +89,14 @@ def associated_records_by_owner
if klass && owner_keys.any?
# 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
sliced = owner_keys.each_slice(klass.connection.in_clause_length || owner_keys.size)
records = sliced.flat_map { |slice|
records = records_for(slice)
set_type_caster records, association_key_name
records
}
caster = type_caster
lhs_records.each do |record|
records.each do |record|
owner_key = caster.call record[association_key_name]
owners_map[owner_key].each do |owner|
......@@ -111,7 +105,7 @@ def associated_records_by_owner
end
end
records_by_owner
@associated_records_by_owner = records_by_owner
end
def set_type_caster(results, name)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册