Skip to content

Use arel for joining with rank table#576

Open
fatkodima wants to merge 1 commit into
Casecommons:masterfrom
fatkodima:use-arel-joins
Open

Use arel for joining with rank table#576
fatkodima wants to merge 1 commit into
Casecommons:masterfrom
fatkodima:use-arel-joins

Conversation

@fatkodima

Copy link
Copy Markdown
Contributor

Fixes #206.

We faced the same problem as described in the linked issue - when active record creates an alias for one of the tables (the table for the top model or one of the joined tables) and the SQL query become invalid when trying to order or group etc.

The problem is here https://github.com/rails/rails/blob/d5afe4f6811c60dc1400c90624a1bbf77c572da6/activerecord/lib/active_record/associations/alias_tracker.rb#L33-L44

When passing a string JOIN, active record simply grep matches it to decide if aliases are needed, for safety. But when passing arel, it can make smarter decisions.

Comment thread lib/pg_search/scope_options.rb Outdated
def rank_join(rank_table_alias)
"INNER JOIN (#{subquery.to_sql}) AS #{rank_table_alias} ON #{primary_key} = #{rank_table_alias}.pg_search_id"
arel_table = model.arel_table
alias_arel_table = Arel::Table.new(rank_table_alias)

@chaadow chaadow Jun 27, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is it possible to make this conditional to support rails main. Because recently Arel::Table was changed to accept keyword arguments

and I won't be able to use your fix on my production app, as well as it won't be compatible for future rails versions.

thanks ( PR link )

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch, thanks! Was able to make it simpler and don't create arel table explicitly.

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.

associated_against in combination with scope order() fails

2 participants