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
11155
(-- --)
2
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
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
adrien