From 847643a55acf9c82d2b70448cfa527fee63e9601 Mon Sep 17 00:00:00 2001 From: eileencodes Date: Tue, 10 Dec 2019 14:15:11 -0500 Subject: [PATCH] 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 --- activerecord/lib/active_record/relation.rb | 14 ++++++++------ .../active_record/relation/record_fetch_warning.rb | 6 +++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb index c3599fa85f..a475a19a87 100644 --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -626,7 +626,10 @@ def delete_by(*args) # # Post.where(published: true).load # => # def load(&block) - exec_queries(&block) unless loaded? + unless loaded? + @records = exec_queries(&block) + @loaded = true + end self end @@ -809,7 +812,7 @@ def _increment_attribute(attribute, value = 1) def exec_queries(&block) skip_query_cache_if_necessary do - @records = + records = if where_clause.contradiction? [] elsif eager_loading? @@ -826,12 +829,11 @@ def exec_queries(&block) 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 diff --git a/activerecord/lib/active_record/relation/record_fetch_warning.rb b/activerecord/lib/active_record/relation/record_fetch_warning.rb index a7d07d23e1..f3a7658549 100644 --- a/activerecord/lib/active_record/relation/record_fetch_warning.rb +++ b/activerecord/lib/active_record/relation/record_fetch_warning.rb @@ -16,10 +16,10 @@ module RecordFetchWarning 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 -- GitLab