提交 989dda36 编写于 作者: M Michael Fowler

Fuse traversals of the record set when preloading

Although consuming code will almost certainly retraverse this set, we can avoid
walking it twice here. As an extra upside, we can avoid the double-use of an
identity-sensitive hash; this is convenient, because it is another collection we
actually don't need to build.
上级 9aa59f9d
......@@ -27,39 +27,41 @@ def run
end
def records_by_owner
# owners can be duplicated when a relation has a collection association join
# #compare_by_identity makes such owners different hash keys
@records_by_owner ||= preloaded_records.each_with_object({}.compare_by_identity) do |record, result|
owners_by_key[convert_key(record[association_key_name])].each do |owner|
(result[owner] ||= []) << record
end
end
load_records unless defined?(@records_by_owner)
@records_by_owner
end
def preloaded_records
return @preloaded_records if defined?(@preloaded_records)
load_records unless defined?(@preloaded_records)
@preloaded_records
end
private
attr_reader :owners, :reflection, :preload_scope, :model, :klass
raw_records = owner_keys.empty? ? [] : records_for(owner_keys)
seen_records_by_owner = {}.compare_by_identity
def load_records
# owners can be duplicated when a relation has a collection association join
# #compare_by_identity makes such owners different hash keys
@records_by_owner = {}.compare_by_identity
raw_records = owner_keys.empty? ? [] : records_for(owner_keys)
@preloaded_records = raw_records.select do |record|
assignments = []
@preloaded_records = raw_records.select do |record|
assignments = []
owners_by_key[convert_key(record[association_key_name])].each do |owner|
entries = (seen_records_by_owner[owner] ||= [])
owners_by_key[convert_key(record[association_key_name])].each do |owner|
entries = (@records_by_owner[owner] ||= [])
if reflection.collection? || entries.empty?
entries << record
assignments << record
if reflection.collection? || entries.empty?
entries << record
assignments << record
end
end
end
!assignments.empty?
!assignments.empty?
end
end
end
private
attr_reader :owners, :reflection, :preload_scope, :model, :klass
# The name of the key on the associated records
def association_key_name
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册