2

最近、スコープを発見しました (me == Rails noob)。涼しい。しかし、名前付きスコープは死んでいることがわかりました。私はそれを正しくしたいので、これを変更します:

 def Foo
    scope :only_some, where('some conditions')

これに(指示に従って):

class << self

   def only_some
      where('some conditions')
   end

end

そして、これは機能しなくなりました:

bar.foos.only_some

例外:

undefined method `only_some' for #<ActiveRecord::Relation:0x007fb398d99178>

私は何を間違っていますか?スコープを使い続ける必要がありますか?

4

1 に答える 1

2

反対に、スコープは、次の 2 つの理由から、関連付けられたオブジェクトを照会するためにクラス メソッドよりも優先されます。

  1. スコープにより、複雑なクエリの生成が簡素化されます。スコープは、呼び出し元が値を必要とするとき (つまり、最終的に) のみ評価される「遅延」シーケンスと考えてください。そのため、複数の SQL クエリによるパフォーマンスの低下を心配することなく、スコープ メソッドを連鎖させることで複雑なクエリを作成できます。クラス メソッドでも同様に行うことができますが、柔軟性は低くなります。現在のスコープで動作するには、これらのクラス メソッドで「スコープ」メソッドを使用する必要があります。

  2. 単一のオブジェクトだけでなく、関連付けられたオブジェクトのコレクションに対してスコープ メソッドを呼び出すことができます。これは、ActiveRecord アソシエーションがスコープ メソッドを呼び出すことができる ActiveRecord::Relation クラスのインスタンスであるのに対し、クラス メソッドの場合はそうではないためです。そして、これはまさにあなたが直面している問題です。あなたの例では、「only_some」をスコープメソッドとして定義すると、ActiveRecord は ActiveRecord::Relation オブジェクトで「only_some」を呼び出し、次に各 foo でそのメソッドを呼び出します。しかし、それをクラス メソッドに再定義すると、このメソッドはモデル クラス Foo でのみ呼び出すことができます。

于 2012-04-27T04:28:57.780 に答える