众所周知,作用域在调用时开始加载。所以这个表达式
articles = Article.published
articles.newest
得到 2 个查询。是的,我们可以这样做
articles = Article.published.newest
但是如果我需要条件怎么办?如果 foo == bar 比继续链。
众所周知,作用域在调用时开始加载。所以这个表达式
articles = Article.published
articles.newest
得到 2 个查询。是的,我们可以这样做
articles = Article.published.newest
但是如果我需要条件怎么办?如果 foo == bar 比继续链。
你不正确。在您的示例中,这两行:
articles = Article.published
articles.newest
这不会生成两个查询。您能够继续链接的原因是这些调用将返回一个ActiveRecord::Relation
,它只会在遍历时执行查询或选择少数其他方法调用,如 count、sum 或其他聚合方法。
如果您从控制台查看此内容,则似乎每一行都在生成一个查询。这是因为在控制台中,inspect
每次评估后都会调用一个隐式调用,这将生成一个查询。
同一张表的条件?
@a = Article.where("published = true AND foo = bar").order("publishing_date desc").limit(1)
如果您需要对多个表进行预加载,请使用该includes(...)
方法。
你可以像下面这样:
articles = foo == bar ? Article.published.newest : Article.published