rails named scopes joined with OR

Is it possible to have OR conditions using named scope ??
For e.g. Gather users based on following or conditions.
1. active is one named scope which finds all users whose state is active
2. OR user id is in 1,2,3

This condition can be written in only one named scope as

named_scope :active_or_explicit, lambda{ |ids|
{ :conditions => ['state = ? OR id in (?)', 'active', [1,2,3]] }
}

Is it possible to have two named scopes that can be joined using OR condition.

Please let me know your views...

Sandip Ransing wrote:

Is it possible to have OR conditions using named scope ??
For e.g. Gather users based on following or conditions.
1. active is one named scope which finds all users whose state is active
2. OR user id is in 1,2,3

This condition can be written in only one named scope as

named_scope :active_or_explicit, lambda{ |ids|
{ :conditions => ['state = ? OR id in (?)', 'active', [1,2,3]] }
}

Is it possible to have two named scopes that can be joined using OR
condition.

Goodness, I hope not. That would be a terrible misuse of named_scopes.

Please let me know your views...

Please see
http://groups.google.com/group/rubyonrails-talk/msg/7789576953707b2e for
some of my reasoning.

--
Sandip

---
www.funonrails.com

Best,

Marnen thx for reply !

Actually I wanted to add "OR" condition to acts_as_mappable finders,
So that result-set will contain my own preferences too...but now it looks like
for this purpose i may either need to mess up with library of
rails_geokit plugin
or override source of named_scope :frowning:

Sandip Ransing wrote:

Marnen thx for reply !

Actually I wanted to add "OR" condition to acts_as_mappable finders,
So that result-set will contain my own preferences too...but now it
looks like
for this purpose i may either need to mess up with library of
rails_geokit plugin
or override source of named_scope :frowning:

No. Don't. It's a bad idea. It should never be necessary. Did you
read the link I posted?

Best,

Marnen, I am not sure what you are saying should never be necessary.
Suppose I have named_scope_a and named_scope_b. Are you saying it
should never be necessary to find the set of records that includes all
those in _a and those in _b? If not that then what is the best way?
To provide a new named scope for the OR condition does not seem very
DRY.

Colin

hmm. I gone through it … but its necessary for me. Is there any workaround ?

How about

result = (named_scope_1 + named_scope_2).uniq

That would loose the sort order I think, though one could always
re-sort of course. Also could one use methods such as first on the
result? Or apply another named scope to the result to further refine
it?

Colin

Yes, the sort order gets lost.

When you add two named_scopes, the result is an Array. So you can
call first on it, but you can't chain another named scope call to it.

Franz,
what you said i was doing this but it’s not good performance wise as it fires 2 queries also
purpose of pagination will be for toss bcoz it will load objects and then do pagination.

Colin,
I am completely agree with your opinion and thinking there should be option for doing this.

Please don't top post, it makes it difficult to follow the thread.

Franz,
what you said i was doing this but it's not good performance wise as it
fires 2 queries also
purpose of pagination will be for toss bcoz it will load objects and then do
pagination.

Colin,
I am completely agree with your opinion and thinking there should be option
for doing this.

Also please quote the bit of the email you are responding to. What
opinion of mine is it that you agree with? I was not aware that I had
expressed any opinion on your suggestion.

Colin

Colin Law wrote:

No. �Don't. �It's a bad idea. �It should never be necessary. �Did you
read the link I posted?

Marnen, I am not sure what you are saying should never be necessary.
Suppose I have named_scope_a and named_scope_b. Are you saying it
should never be necessary to find the set of records that includes all
those in _a and those in _b?

No. I am saying that it should never be possible -- or necessary -- to
do Person.scope_a.and_some_more_records . IMHO, that defeats the
purpose of named_scopes, because the results of the scope chain are no
longer guaranteed to be within scope_a. That's dangerous. If this
syntax were possible, then there would be no obvious difference between
a proper chain like Person.red_hair.blue_eyes and an improper chain like
Person.red_hair.oh_and_everyone_else_too.

If not that then what is the best way?
To provide a new named scope for the OR condition does not seem very
DRY.

It's a completely different scope from either of its constituents.
What's repetitive about that, particularly if you factor out duplication
in other ways?

I'd actually support a syntax for union queries such as
Person.union_scope(:scope_a, :scope_b). This makes it obvious that it
is not a simple scope chain, while still being simple to call.

Colin

Best,

Colin Law wrote:

No. �Don't. �It's a bad idea. �It should never be necessary. �Did you
read the link I posted?

Marnen, I am not sure what you are saying should never be necessary.
Suppose I have named_scope_a and named_scope_b. Are you saying it
should never be necessary to find the set of records that includes all
those in _a and those in _b?

No. I am saying that it should never be possible -- or necessary -- to
do Person.scope_a.and_some_more_records . IMHO, that defeats the
purpose of named_scopes, because the results of the scope chain are no
longer guaranteed to be within scope_a. That's dangerous. If this
syntax were possible, then there would be no obvious difference between
a proper chain like Person.red_hair.blue_eyes and an improper chain like
Person.red_hair.oh_and_everyone_else_too.

Right, understood.

[...]
I'd actually support a syntax for union queries such as
Person.union_scope(:scope_a, :scope_b). This makes it obvious that it
is not a simple scope chain, while still being simple to call.

Is that not what the OP was asking for in the original post to quote from there:

Is it possible to have two named scopes that can be joined using OR condition.

To which you replied:

Goodness, I hope not. That would be a terrible misuse of named_scopes.

Colin

Colin Law wrote:
[...]

[...]
I'd actually support a syntax for union queries such as
Person.union_scope(:scope_a, :scope_b). This makes it obvious that it
is not a simple scope chain, while still being simple to call.

Is that not what the OP was asking for in the original post to quote
from there:

Is it possible to have two named scopes that can be joined using OR condition.

To which you replied:

Goodness, I hope not. That would be a terrible misuse of named_scopes.

I had thought that the OP was specifically asking about named_scope
chaining with OR as in the other thread. On rereading, however, it
seems that you're right and I misunderstood the question.

Colin

Best,