【问题标题】:default_scope with :joins and :select带有 :joins 和 :select 的 default_scope
【发布时间】:2009-10-29 17:54:06
【问题描述】:

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

谢谢!

【问题讨论】:

  • 那么..问题是什么? :) 你想收到什么?两个结果都是一样的。
  • 哦!感谢您指出!固定。

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


【解决方案1】:

这是默认行为。无论您如何定义范围,您都只能获取定义范围的类的对象。尽管您选择了模型列,Rails 不会对它们做任何事情。但是,您可以预先加载关联。这就是您正在尝试做的事情,每次发现都有产品。

其实它比你想象的要简单:

default_scope :include => :product

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

【讨论】:

  • 谢谢,最后这真的解决了我的问题。我知道急切加载。我的问题是我需要将结果集转换为 json,Rails 的 to_json 方法仅将查询中选择的属性添加到 json 输出中。但是,我找到了一种解决方法 - to_json 方法是非常可配置的,并且允许我很容易地从预先加载的关联中添加属性。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多