6

こんにちは私は現在Railsレシピを読んでおり、作成者がモデルでスコープを使用して、コントローラーにクエリを追加せずに(したがって、MVCルールに違反して)コントローラーが特定のクエリフラグメントにアクセスできるようにするセクションが1つあります。ある時点で彼はこれを持っています:

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

ラムダオブジェクトとProcオブジェクトを使用したことはありません。これは、スコープに引数を追加して、概念的には引数を追加することと同じでありscope :with_bio_containing(query)、したがって、スコープを関数であるかのようにカスタマイズできますか?ラムダはRailsのスコープで一般的に使用されていますか?

4

2 に答える 2

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

そして、はい、ラムダは通常、私自身の経験から使用されます。

于 2012-11-21T19:15:27.740 に答える
0

はい、両方の質問に答えます。

Wombat.with_bio_taining('foo')は、実行時に次のように評価されます。

select * from wombats where bio like "%foo%" order by age
于 2012-11-21T19:14:40.330 に答える