views:

159

answers:

1

I know you can create named scopes in Rails, which allow you to specify conditions which can then be built on later:

named_scope :active, :conditions => {:active => true}

...

MyModel.active.find(...)

This works by creating a proxy object which isn't evaluated until later on. What I want to know is if it's possible to create a dynamic unnamed scope?

By which I mean, is there a method 'foo' with which I can go

scope = MyModel.foo(:conditions => {:target_id => 4})

and then pass scope around as a proxy object that I can do more .finds or other scoped calls on?

+7  A: 

Yes, check Anonymous Scopes:

def find_products
  scope = Product.scoped({})
  scope = scope.conditions "products.name LIKE ?", "%#{keywords}%" unless keywords.blank?
  scope = scope.conditions "products.price >= ?", minimum_price unless minimum_price.blank?
  scope = scope.conditions "products.price <= ?", maximum_price unless maximum_price.blank?
  scope = scope.conditions "products.category_id = ?", category_id unless category_id.blank?
  scope
end
khelll
That's perfect, and it's only documented in one file [http://api.rubyonrails.org/classes/ActiveRecord/NamedScope.html] which I can't imagine I'd ever look at otherwise
Gareth