【问题标题】:Lazy scopes in RailsRails 中的惰性作用域
【发布时间】:2013-02-16 23:35:03
【问题描述】:

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

articles = Article.published
articles.newest

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

articles = Article.published.newest

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

【问题讨论】:

  • 我们可以看看你的文章模型吗?一般来说,在您尝试遍历结果或某些其他方法调用(如 count)之前,不应执行查询。
  • Artcile 是抽象的。查询应该是,但不是范围。
  • 作用域是一样的。他们不会立即被执行。

标签: sql ruby-on-rails activerecord scope


【解决方案1】:

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

articles = Article.published
articles.newest

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

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

【讨论】:

  • 一个指向证实此声明的文档或来源的链接会很有用。
【解决方案2】:

你可以这样做:

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

【讨论】:

  • 它将进行 2 次查询。但是 Articles.published.newes - 一个。
  • 但是如果我有两个以上的范围?
【解决方案3】:

同一张表的条件?

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

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

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 2017-04-11
    • 2016-10-26
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多