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


Sandip R. 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 Laibow-Koser
http://www.marnen.org
[email protected]

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:

On 8/18/10, Marnen Laibow-Koser [email protected] wrote:

}
http://groups.google.com/group/rubyonrails-talk/msg/7789576953707b2e for

To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.


Sandip


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

On Wed, Aug 18, 2010 at 3:32 AM, Marnen Laibow-Koser
[email protected]wrote:

No. Don’t. It’s a bad idea. It should never be necessary. Did you

You received this message because you are subscribed to the Google G.
“Ruby on Rails: Talk” group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected][email protected]
.
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.


Sandip


On 17 August 2010 23:02, Marnen Laibow-Koser [email protected]
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? 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

Sandip R. 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 Laibow-Koser
http://www.marnen.org
[email protected]

On 18 August 2010 08:44, Franz S. [email protected] wrote:

On Tue, Aug 17, 2010 at 9:39 PM, Sandip R. [email protected] wrote:

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

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

On Tue, Aug 17, 2010 at 9:39 PM, Sandip R. [email protected]
wrote:

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

How about

result = (named_scope_1 + named_scope_2).uniq

On Wed, Aug 18, 2010 at 9:57 AM, Colin L. [email protected]
wrote:

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?

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.

On Wed, Aug 18, 2010 at 1:27 PM, Colin L. [email protected]
wrote:

To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected][email protected]
.
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.


Sandip


Colin L. wrote:

On 17 August 2010 23:02, Marnen Laibow-Koser [email protected]
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,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Sent from my iPhone

On 18 August 2010 09:15, Sandip R. [email protected] wrote:

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

On 18 August 2010 13:42, Marnen Laibow-Koser [email protected]
wrote:

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 L. 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,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]