bigpotato
bigpotato

Reputation: 27527

Rails 3: Use of lambda with scopes in model

Hi I'm currently reading Rails Recipes and there's one section where the author uses scopes in the model so that the controller has access to certain query fragments without adding queries to the controller (and therefore violating the MVC rules). At one point he has this:

class Wombat < ActiveRecord::Base
  scope :with_bio_containing, lambda {|query| where("bio like ?", "%#{query}%").
                                         order(:age) }
end

I've never used lambda and Proc objects. Is this the equivalent of adding an argument to the scope so that conceptually it's scope :with_bio_containing(query) and therefore allowing me to customize the scope as if it were a function? Is lambda commonly used in scopes in Rails?

Upvotes: 6

Views: 13155

Answers (2)

MrDanA
MrDanA

Reputation: 11647

In concept, you are right. It's like sending an argument. You would call this particular scope like so:

Wombat.with_bio_containing("born in Canada")

You could make a scope that takes in many arguments:

# code
scope :with_name_and_age, lambda { |name, age| where(:name => name, :age => age) }

# call
Wombat.with_name_and_age("Joey", 14)

You can also have no arguments:

# code
scope :from_canada, lambda { where(:country => "Canada") }

# call
Wombat.from_canada

And yes, lambdas are usually used from my own experience.

Upvotes: 14

Unixmonkey
Unixmonkey

Reputation: 18784

Yes to both questions.

Wombat.with_bio_containing('foo') is evaluated at runtime into something like:

select * from wombats where bio like "%foo%" order by age

Upvotes: 0

Related Questions