2012-11-21 10 views
6

Witam Obecnie czytam Rails Recipes i jest jedna sekcja, w której autor używa zakresów w modelu, aby kontroler miał dostęp do pewnych fragmentów zapytania bez dodawania zapytań do kontrolera (a zatem narusza zasady MVC). W pewnym momencie ma to:Szyny 3: Użycie lambda z zakresami w modelu

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

Nigdy nie korzystałem z obiektów lambda i Proc. Czy jest to odpowiednik dodania argumentu do zakresu, aby koncepcyjnie było to scope :with_bio_containing(query), a zatem pozwalając mi dostosować zakres tak, jakby był funkcją? Czy lambda jest powszechnie używana w teleskopach w Railsach?

Odpowiedz

14

W koncepcji, masz rację. To tak jakby wysłać argument. Można by nazwać tę szczególną zakres tak:

Wombat.with_bio_containing("born in Canada") 

Można zrobić zakresu, które odbywają się w wielu argumentów:

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

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

Można również mieć żadnych argumentów:

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

# call 
Wombat.from_canada 

I tak , lambdy są zwykle używane z mojego własnego doświadczenia.

+6

W zakresie: from_canada, ponieważ nic nie wymaga oceny w czasie wykonywania, należy zrezygnować z lambda i po prostu być 'scope: from_canada, where (: country =>" Canada ")' – Unixmonkey

0

Tak na oba pytania.

Wombat.with_bio_containing ('foo') jest oceniana w czasie wykonywania w coś podobnego:

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