2012-08-10 22 views
13

誰かがこのメソッドが何をしているのか、私はそれに渡すことができるのか説明できますか?範囲とスコープ範囲

scoped(options = nil) 
Returns an anonymous scope. 

また、スコープ方式はどのように機能しますか?私はドキュメントを読んだ後に理解しません。

答えて

30

、すべてのクエリの構築方法(などのようなwhereorderjoinslimitとは)いわゆる範囲を返します。 allまたはfirstのようなキッカーメソッドを呼び出した場合にのみ、ビルドアップクエリが実行され、データベースの結果が返されます。

scopedクラスメソッドもスコープを返します。返されるスコープはデフォルトでは空です。つまり、結果セットが制限されず、クエリが実行された場合にすべてのレコードが返されることを意味します。 MurifoXのquery_by_dateの例のように、空の代替手段を提供するために使用できます。 それとも、たとえば同じように、1つのメソッド呼び出しに複数の条件を組み合わせて、それを使用することができます:

Model.scoped(:conditions => 'id < 100', :limit => 10, :order => 'title ASC') 

# which would be equivalent to 
Model.where('id < 100').limit(10).order('title ASC') 

scopeクラスのメソッドを使用すると、また、例えばのように、スコープを返すクラスメソッドを定義することができますこのように使用することができます

class Model 
    scope :colored, lambda {|col| 
    where(:color => col) 
    } 
end 

:あなたが望むよう

Model.colored 

スコープとの良いところは、(ほぼ)あなたがそれらを組み合わせることができますということです、その次は絶対に可能です:

Model.red.where('id < 100').order('title ASC').scoped(:limit => 10) 

私も強くhttp://guides.rubyonrails.org/active_record_querying.html

+0

ありがとうございました。 .scopedに渡すことができるものを私はどのように知っていますか?私は見る:条件=>等 – LuckyLuke

+1

あなたはすべてのオプションの完全なリストをここに見つけるでしょう:http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find-label-Options – severin

+0

恐ろしい!あなたの助けをありがとう – LuckyLuke

5

私はあなたがこのようなActiveRecordクエリインターフェイスへの連鎖の呼び出しを行うpast.Whenでそれを使用している:

Model.where(:conditions).where(:more_conditions).where(:final_conditions) 

それらの一つ一つは、すでに何の問題もなくチェーンを機能させる、スコープされています。しかし、次のようなものがあるとしましょう:

Model.query_by_date(date).query_by_user(user).query_by_status(status) 

scope :query_by_date, lambda { |date| 
    case date 
    when "today" 
    where(:date => Date.today) 
    when "tomorrow" 
    where(:date => Date.tomorrow) 
    else 
    # Any value like '' or 0 or Date.whatever 
    end 
} 

日付パラメタが今日または明日でないと、エラーが発生します。最後の値を選択し、このクエリを次の1つのquery_by_userと連鎖させて、undefined method default_scoped? for ''という結果になります。しかしscopedメソッドをelseの状態にすると、このメソッド/名前付きスコープを渡してwhere/find/other activerecord methodsを呼び出していないが、スコープ付きオブジェクトが返されたことをactiverecordに伝えているので、クエリや物事を連鎖させ続けることができます。
これは最終的にこのようになります。

else 
    scoped 
end 

この簡単な例を理解していただきたいと思います。 ActiveRecordので

+0

を通読をお勧めしますが、それは「スコープ」であることの意味を説明してもらえますか? – LuckyLuke

+1

ActiveRecordに準拠しているのと同じです。すべてのActiveRecords仕様でカプセル化されています。 – MurifoX

+0

私はあなたが意味することを理解している以外の "スコープ"を理解しているかどうかはわかりません。そうでなければ失敗するでしょう。しかし、私はスコープされたものが何をしているのか理解できません。 – LuckyLuke