代码之家  ›  专栏  ›  技术社区  ›  Meliborn

Rails中的惰性作用域

  •  2
  • Meliborn  · 技术社区  · 11 年前

    正如我们所知,作用域在调用时开始加载。所以这个表达式

    articles = Article.published
    articles.newest
    

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

    articles = Article.published.newest
    

    但如果我需要条件呢?如果foo==bar,则继续链。

    3 回复  |  直到 11 年前
        1
  •  11
  •   Sean Hill    11 年前

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

    articles = Article.published
    articles.newest
    

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

    如果您在控制台上查看这一点,那么每一行都会生成一个查询。这是因为在控制台中 inspect 在每次求值后调用,这将生成一个查询。

        2
  •  0
  •   xdazz    11 年前

    您可以按照以下方式操作:

    articles = foo == bar ? Article.published.newest : Article.published
    
        3
  •  0
  •   Benjamin M    11 年前

    同一张表中的条件?

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

    如果您需要急切地加载多个表,请使用 includes(...) 方法