このメソッドが何をするのか、何を渡すことができるのかを誰かが説明できますか?
scoped(options = nil)
Returns an anonymous scope.
また、scope メソッドは何をしますか? ドキュメントを読んでもわかりません。
このメソッドが何をするのか、何を渡すことができるのかを誰かが説明できますか?
scoped(options = nil)
Returns an anonymous scope.
また、scope メソッドは何をしますか? ドキュメントを読んでもわかりません。
ActiveRecord では、すべてのクエリ構築メソッド ( where
、order
、joins
などlimit
) はいわゆるscopeを返します。のようなキッカーメソッドを呼び出す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を読むことを強くお勧めします。
ActiveRecord
私は過去にそれを使用しました.次のようにクエリインターフェイス への連鎖呼び出しを行う場合:
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
}
日付パラメーターが今日または明日でない場合、これによりエラーが発生します。最後の値を選択し、このクエリを次のクエリと連鎖させようとするためquery_by_user
、undefined method default_scoped? for ''
. scoped
ただし、メソッドを条件に入れると、else
問題なく動作します。このメソッド/名前付きスコープを通過し、呼び出しを行わずwhere/find/other activerecord methods
、スコープ付きオブジェクトを返すことを activerecord に伝えているため、スコープ付きオブジェクトを返すことができます。クエリなどの連鎖を続けます。
最終的にはこのようになります。
else
scoped
end
この簡単な例を理解していただければ幸いです。