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 回答