2009-10-29 68 views
3

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

难道这应该是一个bug或者是一个正确的行为?

我正在使用Rails 2.3.4。

谢谢!

+0

那么..这是什么问题? :)你想收到什么? 两个结果都是一样的。 – 2009-10-29 19:00:09

+0

哦!感谢您指出!固定。 – 2009-10-29 19:25:08

回答

5

这是隐瞒的行为。无论您如何定义范围,只能获取定义范围的类的对象。尽管你选择了模型列,但Rails不会对它们做任何事情。但是,您可以急切加载关联。这就是你试图去做的事情,每一次找到产品。

事实上它更简单比您预期:

default_scope :include => :product 

的原因,你的SELECT语句中指定的范围查询的一​​部分,但不是默认范围是每一个基于铁轨查询重写的选择选项进一步查询方法链。唯一的SELECT选项对find语句返回的内容有任何不同,它们是选择模型列的子集的那些选项。

+0

谢谢,最终这真的解决了我的问题。我知道急切的加载。我的问题是,我需要将结果集转换为json,并且Rails的to_json方法仅将查询中选定的属性添加到json输出中。然而,我发现了一个解决方法--to_json方法是非常可配置的,并允许我非常容易地从加载的关联中添加属性。再次感谢! – 2009-10-30 10:14:58