2012-11-21 6 views
6

Hallo Ich lese derzeit Rails Rezepte und es gibt einen Bereich, in dem der Autor Bereiche im Modell verwendet, so dass der Controller Zugriff auf bestimmte Abfragefragmente hat, ohne Abfragen an den Controller (und daher die MVC-Regeln verletzen). An einem Punkt hat er das:Rails 3: Verwendung von Lambda mit Scopes in Modell

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

Ich habe nie Lambda und Proc Objekte verwendet. Ist das gleichbedeutend mit dem Hinzufügen eines Arguments zum Scope, so dass es konzeptionell scope :with_bio_containing(query) ist und es mir daher erlaubt, den Scope so anzupassen, als wäre es eine Funktion? Wird Lambda häufig in Scopes in Rails verwendet?

Antwort

14

In Konzept, Sie haben Recht. Es ist wie ein Argument zu senden. Sie möchten, dass so diese besondere Umfang nennen:

Wombat.with_bio_containing("born in Canada") 

Sie könnten einen Umfang machen, die in vielen Argumente nimmt:

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

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

Sie haben auch keine Argumente:

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

# call 
Wombat.from_canada 

Und ja Normalerweise werden Lambdas aus eigener Erfahrung verwendet.

+6

Im Bereich: from_canada, weil nichts zur Laufzeit ausgewertet werden muss, sollten Sie das Lambda löschen und es ist nur 'scope: from_canada, wo (: country =>" Canada ")' – Unixmonkey

0

Ja zu beiden Fragen.

Wombat.with_bio_containing ('foo') wird zur Laufzeit in so etwas wie bewertet:

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