default_scope with:joins和:select

Mil*_*ota 3 activerecord named-scope ruby-on-rails default-scope

我尝试以下列方式定义default_scope:

default_scope :joins => :product, :select => "catalog_products.*, products.*"
Run Code Online (Sandbox Code Playgroud)

我从Rails得到的是这样的:

 SELECT catalog_products.* FROM `catalog_products` INNER JOIN `products` ON `products`.id = `catalog_products`.product_id 
Run Code Online (Sandbox Code Playgroud)

当我将它定义为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 
Run Code Online (Sandbox Code Playgroud)

这应该是一个错误还是一个正确的行为?

我正在使用Rails 2.3.4.

谢谢!

EmF*_*mFi 5

这是入侵行为.无论您如何定义范围,您都只能获得定义范围的类的对象.尽管您正在选择模型列,但Rails不会对它们执行任何操作.但是,您可以急切加载关联.这就是你想要做的事情,每个发现都有产品.

事实上它比你期望的更简单:

default_scope :include => :product
Run Code Online (Sandbox Code Playgroud)

您的select语句是命名作用域中查询的一部分而不是默认作用域的原因是每个基于rails的查询都会覆盖方法链上方查询的select选项.对find语句返回的内容产生任何影响的唯一SELECT选项是那些选择模型列的子集的选项.