14

このメソッドが何をするのか、何を渡すことができるのかを誰かが説明できますか?

scoped(options = nil)
Returns an anonymous scope.

また、scope メソッドは何をしますか? ドキュメントを読んでもわかりません。

4

2 に答える 2

31

ActiveRecord では、すべてのクエリ構築メソッド ( whereorderjoinsなどlimit) はいわゆるscopeを返します。のようなキッカーメソッドを呼び出すallfirst、構築されたクエリが実行され、データベースからの結果が返される場合にのみ。

クラス メソッドは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を読むことを強くお勧めします。

于 2012-08-10T12:49:26.923 に答える
5

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_userundefined method default_scoped? for ''. scopedただし、メソッドを条件に入れると、else問題なく動作します。このメソッド/名前付きスコープを通過し、呼び出しを行わずwhere/find/other activerecord methods、スコープ付きオブジェクトを返すことを activerecord に伝えているため、スコープ付きオブジェクトを返すことができます。クエリなどの連鎖を続けます。
最終的にはこのようになります。

else
  scoped
end

この簡単な例を理解していただければ幸いです。

于 2012-08-10T11:51:09.010 に答える