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 edgerails.info, 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