I'm not really sure, but maybe hacking directly Arel (https://github.com/rails/arel) instead AR is easier to solve this issue.
On Wed, Jul 6, 2011 at 20:17, Victor Lin <[email protected]> wrote: > I'm fairly certain this 2.x feature never made it to rails 3. You can view > the original ticket and patches here: > http://web.archive.org/web/20081005125758/http://dev.rubyonrails.org/ticket/9560 > > The gist of it is, when you run something like this: > Article.includes(:comments, :author).where('authors.id = 1').limit(10) > > You end up with two queries. The first is a "SELECT DISTINCT authors.id...", > and the next will actually load the comments and authors associations. In > Rails 2.x, AR was smart enough to only join against the tables that actually > limited the resultset (e.g anything in the where or order clauses). Rails 3 > will blindly join all the tables, which kills performance when you have > several eager loaded associations. > > I started working on a patch to apply_join_dependency but ran into a problem > with table aliasing. The diff is here: > https://gist.github.com/1067917 > > The approach is basically to scan the order and where clauses for table > names. Then scan the included associations for these table names, adding > them (and any intermediate joins) to a list, and only joining those > associations. The problem is when the arel object is built for > clean_relation, it has fewer joins than the original. AR builds a > JoinDependency object and JoinDependency#graft's all my joins to it. That > object never actually sees any of the original joins, and so the alias > tracker hands out the default table name instead of the aliased table name. > I don't know how to deal with this without hacking up more of the source > than I want to - anyone have any ideas about how to deal with this? Or maybe > a completely different approach? > > -- > You received this message because you are subscribed to the Google Groups > "Ruby on Rails: Core" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/rubyonrails-core/-/As1BiWORxRAJ. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/rubyonrails-core?hl=en. > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
