0

我有两个has_many模型属于关系。Rails所有包含最后一行的联合关系

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并按照DESC的顺序排列,但它将如何与特定的方案完全关联。

回答

3

如何创建一个相互关联起来是这样的:

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中从数据库检索对象的方法之一。从文档本身:

活动记录让您预先指定要加载的所有关联 。这可以通过指定包含Model.find调用的 方法来实现。使用包含,Active Record确保 所有指定的关联都使用最少的 加载数量的查询加载。

而且,由于我们有关联安装与current_nav,所有我们做的是与includes用它急于加载数据。请阅读ActiveRecord querying doc了解更多信息。

+0

我编辑我的问题与我的怀疑。谢谢你的努力。 – Senthil 2014-10-28 14:22:29

+1

它是否按照您期望的方式工作?我会尽快添加解释。 – Surya 2014-10-28 16:07:23

+1

它取得的结果,但如果你给解释,它将是非常伟大的,因为它的作品像魔术。 – Senthil 2014-10-28 16:41:58