2012-11-21 10 views
6

Ciao Attualmente sto leggendo le ricette di Rails e c'è una sezione in cui l'autore utilizza gli ambiti nel modello in modo che il controllore abbia accesso a determinati frammenti di query senza aggiungere query al controller (e quindi violare le regole MVC). A un certo punto ha questo:Rails 3: uso di lambda con scope nel modello

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

Non ho mai usato lambda e oggetti Proc. È questo l'equivalente dell'aggiunta di un argomento all'oscilloscopio in modo che concettualmente sia scope :with_bio_containing(query) e quindi mi permetta di personalizzare l'oscilloscopio come se fosse una funzione? Lambda è comunemente usato negli ambiti in Rails?

risposta

14

Nel concetto, hai ragione. È come inviare una discussione. Si potrebbe chiamare questo particolare campo di applicazione in questo modo:

Wombat.with_bio_containing("born in Canada") 

Si potrebbe fare un ambito che abbraccia molti argomenti:

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

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

Si può anche avere argomenti:

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

# call 
Wombat.from_canada 

E sì , i lambda sono solitamente usati dalla mia esperienza.

+6

Nell'ambito: from_canada, poiché non è necessario valutare nulla in fase di esecuzione, è necessario eliminare lambda ed essere semplicemente 'scope: from_canada, dove (: country =>" Canada ")' – Unixmonkey

0

Sì a entrambe le domande.

Wombat.with_bio_containing ('foo') viene valutato in fase di esecuzione in qualcosa di simile:

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