2011-01-21 17 views
3

named_scopeが、私はそれに取り組んでいるプロジェクトでありますが、次のようになります。Rails 2.3.x - このActiveRecordスコープはどのように機能しますか?

# default product scope only lists available and non-deleted products 
    ::Product.named_scope :active,  lambda { |*args| 
    Product.not_deleted.available(args.first).scope(:find) 
    } 

初期named_scopeは理にかなっています。ここで混乱する部分は、.scope(:find)がどのように動作するかです。これは別の名前付きスコープ(not_deleted)を明示的に呼び出し、その後に.scope(:find)を適用します。何が/スコープ(:見つける)はここで働くのですか?

答えて

4

:私のコンソール出力、Object.active.scope(:find)リターンで

named_scope :active, {:conditions => {:active => true}} 

を両方の名前付きスコープを結合します。

scope(:find)は名前付きスコープ(またはスコープの組み合わせ)の条件を取得します。スコープの組み合わせは新しい名前付きスコープの作成にも使用できます。例によるので

named_scope :active,  :conditions => 'active = true' 
named_scope :not_deleted, :conditions => 'deleted = false' 

あなたは

named_scope :active_and_not_deleted, :conditions => 'active = true and deleted = false' 

か、あなたは同じである

named_scope :active_and_not_deleted, lambda { self.active.not_deleted.scope(:find) } 

を書くことができを記述します。それが明確になることを願っています。これは、レール3に単純な(クリーナー)となっていることを

注意、あなただけ書くと

scope :active_and_not_deleted, active.not_deleted 
1

スコープは、渡されたメソッドの現在のスコープを返すActiveRecord :: Baseのメソッドです(この時点で実行する場合は実際にクエリを作成するために使用されます)。

# Retrieve the scope for the given method and optional key. 
def scope(method, key = nil) #:nodoc: 
    if current_scoped_methods && (scope = current_scoped_methods[method]) 
    key ? scope[key] : scope 
    end 
end 

だからあなたの例では、ラムダは、他のすべての名前のスコープをマージした後Product.findコールのためのスコープを返します。

私はnamed_scope持っている:迅速な答え

Product.not_deleted.available(args.first) 

は、によって形成された、名前付きスコープ自体である

{:conditions => {:active => true}} 
関連する問題