1

我有两个模型 has_many 属于关系。

Scheme has_many navs

我需要获取只有最后一个导航值的所有方案。我有 10 个方案,每个方案都有大约 100k 导航,但我只需要最后一条记录,即当前值。

急切加载将加载所有导航

Scheme.all.includes(:navs)

如何在急切加载时应用条件以仅获取每个方案的最后一行导航。

更新日志

如果我跑

Scheme.includes(:current_nav).limit(3)

这些是 AR 执行的查询

SELECT  `schemes`.* FROM `schemes`  LIMIT 3
SELECT `navs`.* FROM `navs`  WHERE `navs`.`schemeCode` IN ('D04', 'D01', 'D30')  ORDER BY id DESC

第二个查询是如何工作的,它将获取 schemeCode 属于 list 的所有导航,并按 id DESC 对它们进行排序,但它将如何与特定方案准确关联。

4

1 回答 1

4

如何创建另一个这样的关联:

class Scheme < ActiveRecord::Base
  has_one :current_nav, -> { order('id DESC').limit(1) }, class_name: 'Nav'
end

现在你可以:

Schema.includes(:current_nav).all

或者:

Schema.includes(:current_nav).last(10)

将只急切加载查询方案的最后一个导航。

说明includes是从数据库中检索对象的方法之一ActiveRecord。从文档本身:

Active Record 允许您预先指定将要加载的所有关联。这可以通过指定 Model.find 调用的 include 方法来实现。使用包含,Active Record 确保使用尽可能少的查询来加载所有指定的关联。

而且,由于我们已经建立了与 的关联current_nav,我们所要做的就是使用它includes来预先加载数据。请阅读ActiveRecord 查询文档以获取更多信息。

于 2014-10-28T13:30:57.573 回答