Rails中的惰性范围

时间:2013-03-02 13:45:15

标签: sql ruby-on-rails activerecord scope

如我们所知,范围在调用时开始加载。所以这个表达

articles = Article.published
articles.newest

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

articles = Article.published.newest

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

3 个答案:

答案 0 :(得分:9)

你错了。在您的示例中,两行:

articles = Article.published
articles.newest

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

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

答案 1 :(得分:0)

同桌的条件?

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

如果您需要预先加载多个表格,请使用includes(...)方法。

答案 2 :(得分:0)

你可以这样做:

articles = foo == bar ? Article.published.newest : Article.published