2

众所周知,作用域在调用时开始加载。所以这个表达式

articles = Article.published
articles.newest

得到 2 个查询。是的,我们可以这样做

articles = Article.published.newest

但是如果我需要条件怎么办?如果 foo == bar 比继续链。

4

3 回答 3

11

你不正确。在您的示例中,这两行:

articles = Article.published
articles.newest

这不会生成两个查询。您能够继续链接的原因是这些调用将返回一个ActiveRecord::Relation,它只会在遍历时执行查询或选择少数其他方法调用,如 count、sum 或其他聚合方法。

如果您从控制台查看此内容,则似乎每一行都在生成一个查询。这是因为在控制台中,inspect每次评估后都会调用一个隐式调用,这将生成一个查询。

于 2013-03-02T14:13:02.610 回答
0

同一张表的条件?

@a = Article.where("published = true AND foo = bar").order("publishing_date desc").limit(1)

如果您需要对多个表进行预加载,请使用该includes(...)方法。

于 2013-03-02T13:50:56.693 回答
0

你可以像下面这样:

articles = foo == bar ? Article.published.newest : Article.published
于 2013-03-02T13:51:48.227 回答