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
|
||||
|
||||
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
|
||||
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?
|
||||
end
|
||||
|
||||
|
@ -850,4 +850,19 @@ def test_removing_limit_with_options
|
||||
def test_primary_key
|
||||
assert_equal "id", Post.scoped.primary_key
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user