2012-11-21 35 views
6

嗨我目前正在閱讀Rails Recipes,並且有一部分作者在模型中使用範圍,以便控制器可以訪問某些查詢片段而無需向控制器添加查詢因此違反了MVC規則)。有一點他有:Rails 3:在示範中使用帶範圍的lambda

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

我從來沒有使用lambda和Proc對象。這是否等同於向範圍添加參數,因此在概念上它是scope :with_bio_containing(query),因此允許我將範圍自定義爲它是一個函數? lambda通常在Rails的範圍中使用嗎?

回答

14

在概念上,你是對的。這就像發送一個論點。你會調用這個特殊的範圍,像這樣:

Wombat.with_bio_containing("born in Canada") 

你可以做一個範圍是發生在許多參數:

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

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

你也可以沒有參數:

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

# call 
Wombat.from_canada 

是的,lambda通常是根據我自己的經驗使用的。

+6

在範圍:from_canada中,因爲沒有什麼需要在運行時進行評估,所以您應該放棄lambda,它只是'scope:from_canada,其中(:country =>「Canada」)' – Unixmonkey

0

對於這兩個問題都可以。

Wombat.with_bio_containing( '富')在運行時計算成類似:

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