2012-11-21 6 views
6

私は現在、Rails Recipesを読んでいます。コントローラにクエリーを追加せずにコントローラが特定のクエリの断片にアクセスできるように、モデル内でスコープを使用するセクションがありますしたがってMVCルールに違反します)。ある時点で彼はこれを持っています:Rails 3:モデル内のスコープでのラムダの使用

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

私はラムダとProcオブジェクトを使ったことがありません。これは概念的にはscope :with_bio_containing(query)なので、スコープに引数を追加するのと同じですか?それで、スコープを関数のようにカスタマイズすることができますか?ラムダは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 

とはいラムダは、通常、自分の経験から使用されます。

+6

スコープ:from_canadaでは、実行時に何も評価する必要がないため、ラムダを削除してスコープ:from_canada、(:country => "Canada") ' – Unixmonkey

0

両方の質問に該当します。

Wombat.with_bio_containing( 'fooが')のようなものの中に、実行時に評価されます。

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