Why not merge :joins in with_scope?

Hi,

We're chaining several named_scope calls like this:

Post.something_with_a_join.another_with_a_join

And we found out the :joins in the scope aren't merged.

I'm wondering if there's any reason why :joins aren't merged
but :conditions and :include are, see:
http://github.com/rails/rails/tree/master/activerecord/lib/active_record/base.rb#L1823

I know some join could be contradictory but they can also be required
by the conditions.

I have a patch ready for this but I'm waiting for some feedback before
writing some tests and submitting it, maybe I'm missing something.

Thanks,
Marc

Hi,

We're chaining several named_scope calls like this:

Post.something_with_a_join.another_with_a_join

And we found out the :joins in the scope aren't merged.

I'm wondering if there's any reason why :joins aren't merged
but :conditions and :include are, see:
http://github.com/rails/rails/tree/master/activerecord/lib/active_record/base.rb#L1823

:joins comes in 2 forms. When :joins is like :include (ie an array of
(possibly nested) association names, i don't see why it couldn't
behave like :include. That usage is newish (last autumn?) so it could
jus be an omission. In the other usage where :joins is an sql fragment
then it's rather more problematic (for doing things like removing
duplicates etc...)

Fred

Shouldn't the DB server intelligent enough to filter out duplicates in
that case ?

Thanks!
Fran├žois

You're right, but by not merging :joins it fails in both cases: when
it's like include and as an sql fragment

If we merge the :joins like described here:
http://blog.teksol.info/2008/5/26/why-are-activerecord-scopes-not-merged
, it will only fail in the later case, when it's used a an sql
fragment and both conflict.

Doesn't sound like the sort of thing you could rely on across the board.

You're right, but by not merging :joins it fails in both cases: when
it's like include and as an sql fragment

If we merge the :joins like described here:
http://blog.teksol.info/2008/5/26/why-are-activerecord-scopes-not-merged
, it will only fail in the later case, when it's used a an sql
fragment and both conflict.

I think you'd probably want to base yourself on what :include does (in
fact you could probably reuse the merge_includes code), as you need to
handle the fact that you can say :joins => :foo or :joins => [:foo]
and things like that

Fred

Hey,

I'm probably the last person to touch the :joins => :association style
syntax so I'd like to chime in with a warning here. The change
proposed in:

http://blog.teksol.info/2008/5/26/why-are-activerecord-scopes-not-merged

sets off alarm bells for me. See the following line:

http://github.com/rails/rails/tree/master/activerecord/lib/active_record/base.rb#L1552

What that line does is ensure that your joins {:like => :this}, :or,
[:like, :this] will be treated as an *inner* join. If you just
concatenate the :joins together into a string you'll break those
semantics.

I know Fred has already brought it to your attention that you should
base your code off the way that :includes are handled (merge_includes)
but I just wanted to add some weight to that.

And as for "why doesn't it already do what it ought to?"... I'm pretty
sure that when I reworked that stuff I didn't actually *remove*
anything so I kind of hope it never merged joins in scopes in the
first place... if I did remove something critical then I shall quietly
flog myself :stuck_out_tongue:

Regards,
Trevor