3

次の方法で default_scope を定義しようとしました。

default_scope :joins => :product, :select => "catalog_products.*, products.*"

私がRailsから得ているのはこれです:

 SELECT catalog_products.* FROM `catalog_products` INNER JOIN `products` ON `products`.id = `catalog_products`.product_id 

これを named_scope として定義すると、すべて問題ありません。

named_scope :extended, :joins => :product, :select => "catalog_products.*, products.*"


SELECT catalog_products.*, products.* FROM `catalog_products` INNER JOIN `products` ON `products`.id = `catalog_products`.product_id 

これはバグであるはずですか、それとも正しい動作ですか?

Rails 2.3.4 を使用しています。

ありがとう!

4

1 に答える 1

5

これは意図された動作です。スコープをどのように定義するかに関係なく、スコープを定義するクラスのオブジェクトのみを取得できます。モデル列を選択しているという事実にもかかわらず、Rails はそれらに対して何もしません。ただし、アソシエーションを熱心にロードすることはできます。これは、あなたがやろうとしているように見えるもので、すべての検索で製品が表示されます。

実際、予想よりも簡単です。

default_scope :include => :product

select ステートメントが名前付きスコープのクエリの一部であり、デフォルト スコープではない理由は、すべての Rails ベースのクエリがメソッド チェーンのさらに上にあるクエリの選択オプションをオーバーライドするためです。find ステートメントによって返されるものに違いをもたらす唯一の SELECT オプションは、モデルの列のサブセットを選択するオプションです。

于 2009-10-29T23:27:05.157 に答える