Move records and loaded ivar up to load

We should set the `@records` and `@loaded` ivar inside `#load` rather
than in `#exec_queries`. Since `#load` is running `#exec_queries` and
`@records` can only be assigned if `loaded?` is true and `@loaded` can
only be set if `loaded?` is true then `#load` should do the assignment.
This is cleaner but also we came across this while working on an
internal gem and realized that the ivar assignment was happening in the
wrong place.

Co-authored-by: Aaron Patterson <aaron.patterson@gmail.com>
This commit is contained in:
eileencodes 2019-12-10 14:15:11 -05:00
parent 19c5bd38f4
commit 847643a55a
2 changed files with 11 additions and 9 deletions

View File

@ -626,7 +626,10 @@ module ActiveRecord
#
# Post.where(published: true).load # => #<ActiveRecord::Relation>
def load(&block)
exec_queries(&block) unless loaded?
unless loaded?
@records = exec_queries(&block)
@loaded = true
end
self
end
@ -809,7 +812,7 @@ module ActiveRecord
def exec_queries(&block)
skip_query_cache_if_necessary do
@records =
records =
if where_clause.contradiction?
[]
elsif eager_loading?
@ -826,12 +829,11 @@ module ActiveRecord
klass.find_by_sql(arel, &block).freeze
end
preload_associations(@records) unless skip_preloading_value
preload_associations(records) unless skip_preloading_value
@records.each(&:readonly!) if readonly_value
records.each(&:readonly!) if readonly_value
@loaded = true
@records
records
end
end

View File

@ -16,10 +16,10 @@ module ActiveRecord
def exec_queries
QueryRegistry.reset
super.tap do
super.tap do |records|
if logger && warn_on_records_fetched_greater_than
if @records.length > warn_on_records_fetched_greater_than
logger.warn "Query fetched #{@records.size} #{@klass} records: #{QueryRegistry.queries.join(";")}"
if records.length > warn_on_records_fetched_greater_than
logger.warn "Query fetched #{records.size} #{@klass} records: #{QueryRegistry.queries.join(";")}"
end
end
end