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 Nom 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

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')

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

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

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