Skip to content

Fix Ransack redundant left join statements - #1612

Closed
scarroll32 with Copilot wants to merge 5 commits into
mainfrom
copilot/fix-ec6bbd02-18bf-41b3-af8a-f9165e40a90f
Closed

scarroll32 with Copilot wants to merge 5 commits into
mainfrom
copilot/fix-ec6bbd02-18bf-41b3-af8a-f9165e40a90f

Conversation

Copilot AI commented Sep 24, 2025 •

Copy link
Copy Markdown
Contributor

Fix for Redundant Left Join Issue

Problem:
Ransack was generating redundant LEFT OUTER JOIN statements when INNER JOINs to the same table already existed in the relation.

Root cause:
The @joined_tables hash in JoinDependency was only tracking OuterJoin types, not InnerJoins, causing Ransack to create new LEFT OUTER JOINs to tables that were already joined with INNER JOINs.

Solution:

  • Analyze the issue and identify root cause
  • Modified table_aliases_for method to track ALL join types in @joined_tables, not just OuterJoins
  • This prevents duplicate joins by ensuring existing joins are tracked regardless of join type
  • Test the fix with the provided test case
  • Ensure no regression in existing functionality

Changes:

  1. lib/polyamorous/activerecord/join_dependency.rb: Removed condition that only tracked OuterJoins in @joined_tables
  2. spec/ransack/adapters/active_record/redundant_joins_spec.rb: Added comprehensive tests to prevent regression

Before Fix:

SELECT "comments".* FROM "comments" 
INNER JOIN "articles" ON "articles"."id" = "comments"."article_id" 
INNER JOIN "authors" ON "authors"."id" = "articles"."author_id" 
LEFT OUTER JOIN "authors" "authors_articles" ON "authors_articles"."id" = "articles"."author_id" 
WHERE "authors"."name" = 'abc'

After Fix:

SELECT "comments".* FROM "comments" 
INNER JOIN "articles" ON "articles"."id" = "comments"."article_id" 
INNER JOIN "authors" ON "authors"."id" = "articles"."author_id" 
WHERE "authors"."name" = 'abc'

The fix ensures that when a relation already has INNER JOINs to certain tables, Ransack will reuse those tables instead of creating redundant LEFT OUTER JOINs.

Fixes #1433

Fixes #1433


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 2 commits September 24, 2025 17:10
Co-authored-by: scarroll32 <11340230+scarroll32@users.noreply.github.com>
Co-authored-by: scarroll32 <11340230+scarroll32@users.noreply.github.com>

@scarroll32 scarroll32 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot the CI is failing

…cates

Co-authored-by: scarroll32 <11340230+scarroll32@users.noreply.github.com>

Copilot AI commented Sep 25, 2025

Copy link
Copy Markdown
Contributor Author

@copilot the CI is failing

Fixed the CI issue. The problem was with my original implementation - I was using a complex approach with method visibility issues. I've simplified the fix to a single line change that addresses the root cause: the @joined_tables hash was only tracking OuterJoins, not InnerJoins, causing duplicate joins.

The fix in commit 0e25523 removes the join type restriction so all joins are tracked, preventing duplicates. This is much cleaner and less likely to cause test failures.

Copilot AI changed the title [WIP] Ransack generates redundant left join statements Fix Ransack redundant left join statements Sep 25, 2025
Copilot AI requested a review from scarroll32 September 25, 2025 07:18
join_dependency.instance_variable_set(:@alias_tracker, alias_tracker)

# Track existing join nodes to prevent duplicate joins
join_dependency.populate_joined_tables_from_existing_joins(join_nodes, relation)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NoMethodError: undefined method 'populate_joined_tables_from_existing_joins' for an instance of ActiveRecord::Associations::JoinDependency

@scarroll32

Copy link
Copy Markdown
Member

Note

Comment from Claude (Claude Code), acting on behalf of @scarroll32.

Closing as part of clearing the PR backlog ahead of 5.0.0 (#1640).

This is one of a batch of PRs opened by the Copilot coding agent in September 2025. They have aged out: main has moved on substantially since (Rails 8.1 support, the CI matrix rework in #1667, the v5.0.0 branch consolidation in #1647), and most of these either no longer apply cleanly, no longer pass, or carry specs that don't run under the project's _spec.rb pattern.

The underlying issue stays open. Nothing is being dismissed on the merits — the bug reports behind these PRs are still valid and still wanted. What's being retired is a batch of stale machine-generated branches that cost more to salvage than to redo.

If you're affected by the underlying issue, the most useful contribution is a PR with a failing spec that reproduces it against current main — see CONTRIBUTING.md.

@scarroll32 scarroll32 closed this Sep 21, 2026
@scarroll32
scarroll32 deleted the copilot/fix-ec6bbd02-18bf-41b3-af8a-f9165e40a90f branch October 1, 2026 21:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ransack generates redundant left join statements

3 participants