Ruby on rails Rails从关联中获取所有数据,包括最后一行

Ruby on rails Rails从关联中获取所有数据,包括最后一行,ruby-on-rails,ruby-on-rails-4,associations,eager-loading,queryinterface,Ruby On Rails,Ruby On Rails 4,Associations,Eager Loading,Queryinterface,我有两个模型和很多属于关系 Scheme has_many navs 我需要获取所有只有最后一个导航值的方案。我有10个方案,每个方案有大约100k导航,但我只需要最后一个记录,即当前值 通过快速加载,将加载所有导航 Scheme.all.includes(:navs) 如何应用条件,以便在快速加载时仅获取每个方案的最后一行导航 使用日志更新 如果我跑 Scheme.includes(:current_nav).limit(3) 这些是AR执行的查询 SELECT `schemes`.*

我有两个模型和很多属于关系

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的所有NAV按id DESC排序,但它将如何与特定scheme精确关联。

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

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

将仅加载查询方案的最后一个nav

解释:是在
ActiveRecord
中从数据库检索对象的方法之一。从文档本身:

Active Record允许您提前指定所需的所有关联 将要加载。这可以通过指定includes来实现 Model.find调用的方法。使用includes,Active Record可确保 使用最小值加载所有指定的关联 可能的查询数


而且,由于我们有与
current_nav
的关联设置,所以我们所要做的就是将它与
includes
一起使用,以快速加载数据。有关更多信息,请阅读。

创建另一个类似以下内容的关联如何:

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

将仅加载查询方案的最后一个nav

解释:是在
ActiveRecord
中从数据库检索对象的方法之一。从文档本身:

Active Record允许您提前指定所需的所有关联 将要加载。这可以通过指定includes来实现 Model.find调用的方法。使用includes,Active Record可确保 使用最小值加载所有指定的关联 可能的查询数


而且,由于我们有与
current_nav
的关联设置,所以我们所要做的就是将它与
includes
一起使用,以快速加载数据。请阅读了解更多信息。

它是否按照您预期的方式工作?我很快会添加解释。它的结果很吸引人,但是如果你给出解释,它会非常棒,因为它像魔术一样工作。@Senthil:添加解释,我很高兴你的问题解决了。我想我不需要这么说,但既然我被OPs on SO弄得不知所措,因为即使它有帮助,我也不接受答案,所以,如果他们解决了你的问题,请接受你问题的答案。有一个愉快的编程。它的工作方式是你期待的吗?我很快会添加解释。它的结果很吸引人,但是如果你给出解释,它会非常棒,因为它像魔术一样工作。@Senthil:添加解释,我很高兴你的问题解决了。我想我不需要这么说,但既然我被OPs on SO弄得不知所措,因为即使它有帮助,我也不接受答案,所以,如果他们解决了你的问题,请接受你问题的答案。祝你有一个愉快的节目。
Schema.includes(:current_nav).last(10)