aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2017-08-25 16:36:55 +0900
committerRyuta Kamizono <kamipo@gmail.com>2017-08-25 16:36:55 +0900
commit1a723c65bbe91ad969b67416233d20eff6d2a46a (patch)
treea9f47b50453696ffcb8c41d1c28494cc4f23af63 /activerecord/lib
parentcb5af0d750198739d85b99aecd2f69927ec42e6a (diff)
downloadrails-1a723c65bbe91ad969b67416233d20eff6d2a46a.tar.gz
rails-1a723c65bbe91ad969b67416233d20eff6d2a46a.tar.bz2
rails-1a723c65bbe91ad969b67416233d20eff6d2a46a.zip
Should work inverse association when eager loading
This regression was caused by caa178c1. The block for `set_inverse_instance` should also be passed to join dependency. Fixes #30402.
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/associations/join_dependency.rb6
-rw-r--r--activerecord/lib/active_record/relation.rb16
-rw-r--r--activerecord/lib/active_record/relation/finder_methods.rb11
3 files changed, 18 insertions, 15 deletions
diff --git a/activerecord/lib/active_record/associations/join_dependency.rb b/activerecord/lib/active_record/associations/join_dependency.rb
index dc029c08bd..ac37c3c015 100644
--- a/activerecord/lib/active_record/associations/join_dependency.rb
+++ b/activerecord/lib/active_record/associations/join_dependency.rb
@@ -119,7 +119,7 @@ module ActiveRecord
end
def aliases
- Aliases.new join_root.each_with_index.map { |join_part, i|
+ @aliases ||= Aliases.new join_root.each_with_index.map { |join_part, i|
columns = join_part.column_names.each_with_index.map { |column_name, j|
Aliases::Column.new column_name, "t#{i}_r#{j}"
}
@@ -127,7 +127,7 @@ module ActiveRecord
}
end
- def instantiate(result_set, aliases)
+ def instantiate(result_set, &block)
primary_key = aliases.column_alias(join_root, join_root.primary_key)
seen = Hash.new { |i, object_id|
@@ -150,7 +150,7 @@ module ActiveRecord
message_bus.instrument("instantiation.active_record", payload) do
result_set.each { |row_hash|
parent_key = primary_key ? row_hash[primary_key] : row_hash
- parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases)
+ parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases, &block)
construct(parent, join_root, row_hash, result_set, seen, model_cache, aliases)
}
end
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index d319978930..012bc838b1 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -566,7 +566,7 @@ module ActiveRecord
relation = self
if eager_loading?
- find_with_associations { |rel| relation = rel }
+ find_with_associations { |rel, _| relation = rel }
end
conn = klass.connection
@@ -660,7 +660,19 @@ module ActiveRecord
def exec_queries(&block)
skip_query_cache_if_necessary do
- @records = eager_loading? ? find_with_associations.freeze : @klass.find_by_sql(arel, &block).freeze
+ @records =
+ if eager_loading?
+ find_with_associations do |relation, join_dependency|
+ if ActiveRecord::NullRelation === relation
+ []
+ else
+ rows = connection.select_all(relation.arel, "SQL")
+ join_dependency.instantiate(rows, &block)
+ end.freeze
+ end
+ else
+ klass.find_by_sql(arel, &block).freeze
+ end
preload = preload_values
preload += includes_values unless eager_loading?
diff --git a/activerecord/lib/active_record/relation/finder_methods.rb b/activerecord/lib/active_record/relation/finder_methods.rb
index 5da9573052..2aed941916 100644
--- a/activerecord/lib/active_record/relation/finder_methods.rb
+++ b/activerecord/lib/active_record/relation/finder_methods.rb
@@ -372,16 +372,7 @@ module ActiveRecord
relation = select aliases.columns
relation = apply_join_dependency(relation, join_dependency)
- if block_given?
- yield relation
- else
- if ActiveRecord::NullRelation === relation
- []
- else
- rows = skip_query_cache_if_necessary { connection.select_all(relation.arel, "SQL") }
- join_dependency.instantiate(rows, aliases)
- end
- end
+ yield relation, join_dependency
end
def construct_relation_for_exists(relation, conditions)