我尝试按以下方式定义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。
谢谢!
答案 0 :(得分:5)
这是入侵行为。无论您如何定义范围,您都只能获得定义范围的类的对象。尽管您正在选择模型列,但Rails不会对它们执行任何操作。但是,您可以急切加载关联。这就是你想要做的事情,每个发现都有产品。
事实上它比你期望的更简单:
default_scope :include => :product
您的select语句是命名范围中查询的一部分但不是默认范围的原因是每个基于rails的查询都会覆盖方法链上方查询的选择选项。对find语句返回的内容产生任何影响的唯一SELECT选项是那些选择模型列的子集的选项。