4

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?

khelll
  • 23,590
  • 15
  • 91
  • 109
Gareth
  • 133,157
  • 36
  • 148
  • 157

1 Answers1

7

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
  • 23,590
  • 15
  • 91
  • 109
  • 1
    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 Dec 16 '09 at 14:39