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

keep preloaded records in a list rather than extract from a hash

上级 4c045876
...@@ -3,6 +3,7 @@ module Associations ...@@ -3,6 +3,7 @@ module Associations
class Preloader class Preloader
class Association #:nodoc: class Association #:nodoc:
attr_reader :owners, :reflection, :preload_scope, :model, :klass attr_reader :owners, :reflection, :preload_scope, :model, :klass
attr_reader :preloaded_records
def initialize(klass, owners, reflection, preload_scope) def initialize(klass, owners, reflection, preload_scope)
@klass = klass @klass = klass
...@@ -12,7 +13,7 @@ def initialize(klass, owners, reflection, preload_scope) ...@@ -12,7 +13,7 @@ def initialize(klass, owners, reflection, preload_scope)
@model = owners.first && owners.first.class @model = owners.first && owners.first.class
@scope = nil @scope = nil
@owners_by_key = nil @owners_by_key = nil
@associated_records_by_owner = nil @preloaded_records = []
end end
def run(preloader) def run(preloader)
...@@ -65,15 +66,9 @@ def options ...@@ -65,15 +66,9 @@ def options
reflection.options reflection.options
end end
def preloaded_records
@associated_records_by_owner.values.flatten
end
private private
def associated_records_by_owner(preloader) def associated_records_by_owner(preloader)
return @associated_records_by_owner if @associated_records_by_owner
owners_map = owners_by_key owners_map = owners_by_key
owner_keys = owners_map.keys.compact owner_keys = owners_map.keys.compact
...@@ -94,18 +89,19 @@ def associated_records_by_owner(preloader) ...@@ -94,18 +89,19 @@ def associated_records_by_owner(preloader)
end end
end end
end end
owners.each_with_object(records_by_owner) do |owner,h| owners.each_with_object(records_by_owner) do |owner,h|
h[owner] ||= [] h[owner] ||= []
end end
@associated_records_by_owner = records_by_owner
end end
def load_slices(slices) def load_slices(slices)
slices.flat_map { |slice| @preloaded_records = slices.flat_map { |slice|
records_for(slice).to_a.map! { |record| records_for(slice)
[record, record[association_key_name]] }
}
@preloaded_records.map { |record|
[record, record[association_key_name]]
} }
end end
......
...@@ -38,7 +38,7 @@ def load_slices(slices) ...@@ -38,7 +38,7 @@ def load_slices(slices)
caster = nil caster = nil
name = association_key_name name = association_key_name
slices.flat_map { |slice| records_to_keys = slices.flat_map { |slice|
records = records_for(slice) records = records_for(slice)
caster ||= records.column_types.fetch(name, records.identity_type) caster ||= records.column_types.fetch(name, records.identity_type)
records.map! { |row| records.map! { |row|
...@@ -46,6 +46,9 @@ def load_slices(slices) ...@@ -46,6 +46,9 @@ def load_slices(slices)
[record, caster.type_cast(row[name])] [record, caster.type_cast(row[name])]
} }
} }
@preloaded_records = records_to_keys.map(&:first)
records_to_keys
end end
def build_scope def build_scope
......
...@@ -2,6 +2,10 @@ module ActiveRecord ...@@ -2,6 +2,10 @@ module ActiveRecord
module Associations module Associations
class Preloader class Preloader
module ThroughAssociation #:nodoc: module ThroughAssociation #:nodoc:
def initialize(klass, owners, reflection, preload_scope)
super
@associated_records_by_owner = nil
end
def through_reflection def through_reflection
reflection.through_reflection reflection.through_reflection
...@@ -11,9 +15,11 @@ def source_reflection ...@@ -11,9 +15,11 @@ def source_reflection
reflection.source_reflection reflection.source_reflection
end end
def associated_records_by_owner(preloader) def preloaded_records
return @associated_records_by_owner if @associated_records_by_owner @associated_records_by_owner.values.flatten
end
def associated_records_by_owner(preloader)
preloader.preload(owners, preloader.preload(owners,
through_reflection.name, through_reflection.name,
through_scope) through_scope)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册