default_scope with:joins和:select

时间:2009-10-29 17:54:06

标签: ruby-on-rails activerecord named-scope default-scope

我尝试按以下方式定义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。

谢谢!

1 个答案:

答案 0 :(得分:5)

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

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

default_scope :include => :product

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