Skip to content

Commit

Permalink
access preloaders independently of model mutations
Browse files Browse the repository at this point in the history
  • Loading branch information
tenderlove committed Sep 20, 2013
1 parent 31744e4 commit ec7cc6a
Showing 1 changed file with 12 additions and 12 deletions.
24 changes: 12 additions & 12 deletions activerecord/lib/active_record/associations/preloader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,24 +86,29 @@ def initialize(records, associations, preload_scope = nil)
@records = Array.wrap(records).compact.uniq
@associations = Array.wrap(associations)
@preload_scope = preload_scope || NULL_RELATION
@preloaders = nil
end

NULL_RELATION = Struct.new(:values).new({})

def run
run_preload associations, records
preloaders.each(&:run)
end

private
def preloaders
return @preloaders if @preloaders

def run_preload(associations, records)
unless records.empty?
associations.flat_map { |association|
if records.empty?
@preloaders = []
else
@preloaders = associations.flat_map { |association|
preload(association, records)
}.each(&:run)
}
end
end

private

def preload(association, records)
case association
when Hash
Expand All @@ -123,12 +128,7 @@ def preloaders_for_hash(association, records)
loaders = preloaders_for_one parent, records

recs = loaders.flat_map(&:target_records).uniq
lls = Array.wrap(child).flat_map { |assoc| preload assoc, recs }
loaders + lls
end

def preload_hash(association, records)
preloaders_for_hash(association, records).each(&:run)
loaders.concat Array.wrap(child).flat_map { |assoc| preload assoc, recs }
end

# Not all records have the same class, so group then preload group on the reflection
Expand Down

0 comments on commit ec7cc6a

Please sign in to comment.