【问题标题】:Eager loading association but limit return渴望加载关联但限制返回
【发布时间】:2011-11-06 20:49:07
【问题描述】:

这似乎是一个简单的查询,但我就是搞不懂。

基本上它归结为具有帖子的类别的古老概念。预期的关联已经到位,一个类别有_many 个帖子,而一个帖子属于一个类别。

我想检索所有类别及其帖子,但将帖子数量限制为 10 个。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-3.1


    【解决方案1】:

    这不是您可以使用原始 SQL 执行的操作,因为 LIMIT 是针对总数据集大小的,而不是其他任何内容。

    纯粹通过 SQL 执行此操作的唯一方法是在您的联接和过滤器中创建一个假 id 列,而不是在它出现时创建一个虚假的 id 列,这在实现方面非常依赖于您使用的数据库服务器。

    另一种选择是获取所有类别和帖子并减少记录集,或者获取所有类别并按照 Joerg 的建议迭代获得 10 个帖子。

    【讨论】:

      【解决方案2】:

      您需要在一个 SQL 语句中检索它们吗?或者在需要时可以延迟加载它们吗?

      在什么情况下

      Category.all
      

      将获取您的所有类别,并逐步浏览它们以获取您的帖子可能只是

      Category.all.each do |category|
        category.posts.limit(10)
      end
      

      这还不够吗?

      【讨论】:

      • 我试图避免 N+1 个查询,这就是它当前的工作方式,但这意味着当它可以(我认为)在 1 个查询中执行时,会执行许多查询来呈现页面.
      • 不幸的是,我认为这不可能 - 正如 Neil 所说 - 限制适用于整个数据集。您可能会构建一个 SQL 语句(取决于您的数据库和版本)在子查询中收集帖子,但对您的数据库来说可能会付出类似的努力,但可能会降低可读性。我也不建议将所有数据放在一个数据集中,然后在 Ruby 中根据您的要求对其进行切割——这会导致每个对象的性能受到巨大影响——并且需要实例化许多不必要的对象。跨度>
      猜你喜欢
      • 2013-02-17
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 2021-08-11
      • 2014-03-13
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多