Named scope in named scope?

Hi,

I would like to return a combination of named scopes in a named
scope :

For example, I have a named scope filter and I want to add a named
scope eval_filters like

Product.eval_filters([‘x’,‘y’,‘z’]) is equivalent to
Product.filter(‘x’).filter(‘y’).filter(‘z’)

Anybody know how can I define the named_scope eval_filters to do
that ?

Thanks

adrien :slight_smile:

Adrien N. wrote:

Hi,

I would like to return a combination of named scopes in a named
scope :

For example, I have a named scope filter and I want to add a named
scope eval_filters like

Product.eval_filters([‘x’,‘y’,‘z’]) is equivalent to
Product.filter(‘x’).filter(‘y’).filter(‘z’)

From
http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/,
you could do something like

scope :eval_filters, lambda { |fltr| fltr.inject(scoped) {
|combined_scope, flt| combined_scope.where(“id = ?”, flt) }}

Thanks
Raja

On Sep 23, 9:29 pm, Adrien C. [email protected] wrote:

Well it wouldn’t be a scope strictly speaking, but it would return a
scope and I believe you could call it on a scope:

def self.eval_filters(filters)
filters.inject(self) { |scope, filter| scope.send filter}
end

Perfect solution !
Thanks a lot :slight_smile:

adrien

On Sep 24, 9:35 am, Frederick C. [email protected]

On Sep 28, 9:38 am, Adrien C. [email protected] wrote:

That works fine when I give some filters to the function but when
filters is an empty array, I lost the previous name scope.
Example :

Category.first.products.eval_filters(“public_domain”) -----> OK !
Category.first.products.eval_filters(nil) ------> return Product.all

When I use the debugger in the function, self is always an instance of
the class Product.

yeah, that will happen. Best thing is to call a trivial scope eg
scoped({})

Fred

Works well !
I replace
filters.inject(self) { |scope, filter| scope.send filter}
by
filters.inject(scoped) { |scope, filter| scope.send filter}

Thanks :slight_smile:

adrien

On Sep 28, 12:50 pm, Frederick C. [email protected]

Finally I still have a problem :

I used this definition for my “pseudo-named scope” :

def self.eval_filters(filters)
filters.inject(self) { |scope, filter| scope.send filter}
end

That works fine when I give some filters to the function but when
filters is an empty array, I lost the previous name scope.
Example :

Category.first.products.eval_filters(“public_domain”) -----> OK !
Category.first.products.eval_filters(nil) ------> return Product.all

When I use the debugger in the function, self is always an instance of
the class Product.

Any help please ?

Thanks a lot

adrien

NB: I use Rails 2.3.8

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs