代码之家  ›  专栏  ›  技术社区  ›  Milan Novota

默认范围:联接和:选择

  •  3
  • Milan Novota  · 技术社区  · 15 年前

    我试图用以下方式定义一个默认范围:

    default_scope :joins => :product, :select => "catalog_products.*, products.*"
    

    不过,我从铁路上得到的是:

     SELECT catalog_products.* FROM `catalog_products` INNER JOIN `products` ON `products`.id = `catalog_products`.product_id 
    

    当我把它定义为一个命名的_范围时,一切都很好:

    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 回复  |  直到 15 年前
        1
  •  5
  •   EmFi    15 年前

    这是不负责任的行为。无论如何定义作用域,都只能获取定义作用域的类的对象。尽管您选择的是非模型列,但是Rails不会对它们做任何操作。但是,您可以急切地加载关联。这就是你想要做的,每一个发现都有产品。

    事实上,这比你想象的要简单:

    default_scope :include => :product
    

    之所以select语句是命名作用域中查询的一部分,而不是默认作用域,是因为每个基于rails的查询都会覆盖方法链上查询的select选项。唯一与find语句返回的内容有任何区别的选择选项是那些选择模型列子集的选项。

    推荐文章