Referencing a table via the ON condition in a join should force that table to be eager-loaded via a JOIN rather than via subsequent queries.
This commit is contained in:
parent
9cee693213
commit
532f915037
@ -407,8 +407,19 @@ def method_missing(method, *args, &block)
|
|||||||
private
|
private
|
||||||
|
|
||||||
def references_eager_loaded_tables?
|
def references_eager_loaded_tables?
|
||||||
|
joined_tables = arel.join_sources.map do |join|
|
||||||
|
if join.is_a?(Arel::Nodes::StringJoin)
|
||||||
|
tables_in_string(join.left)
|
||||||
|
else
|
||||||
|
[join.left.table_name, join.left.table_alias]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
joined_tables += [table.name, table.table_alias]
|
||||||
|
|
||||||
# always convert table names to downcase as in Oracle quoted table names are in uppercase
|
# always convert table names to downcase as in Oracle quoted table names are in uppercase
|
||||||
joined_tables = (tables_in_string(arel.join_sql) + [table.name, table.table_alias]).compact.map{ |t| t.downcase }.uniq
|
joined_tables = joined_tables.flatten.compact.map { |t| t.downcase }.uniq
|
||||||
|
|
||||||
(tables_in_string(to_sql) - joined_tables).any?
|
(tables_in_string(to_sql) - joined_tables).any?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -850,4 +850,19 @@ def test_removing_limit_with_options
|
|||||||
def test_primary_key
|
def test_primary_key
|
||||||
assert_equal "id", Post.scoped.primary_key
|
assert_equal "id", Post.scoped.primary_key
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_eager_loading_with_conditions_on_joins
|
||||||
|
scope = Post.includes(:comments)
|
||||||
|
|
||||||
|
# This references the comments table, and so it should cause the comments to be eager
|
||||||
|
# loaded via a JOIN, rather than by subsequent queries.
|
||||||
|
scope = scope.joins(
|
||||||
|
Post.arel_table.create_join(
|
||||||
|
Post.arel_table,
|
||||||
|
Post.arel_table.create_on(Comment.arel_table[:id].eq(3))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert scope.eager_loading?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user