【问题标题】:Rails fetch all including last row from associationRails 从关联中获取所有内容,包括最后一行
【发布时间】:2014-10-18 14:01:46
【问题描述】:

我有两个模型,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 对它们进行排序,但是它将如何与特定方案准确关联。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 associations eager-loading queryinterface


    【解决方案1】:

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

    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 调用的方法。通过包含,Active Record 确保 使用最小值加载所有指定的关联 可能的查询数。

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

    【讨论】:

    • 它的工作方式是否符合您的预期?我会尽快添加说明。
    • 它的获取结果,但如果你给出解释,它会非常棒,因为它就像魔术一样工作。
    • @Senthil :添加了解释,很高兴您的问题得到解决。我以为我不需要说出来,但是由于我对 SO 上的 OP 感到不知所措,因为即使有帮助也不接受答案,因此,如果他们解决了您的问题,请接受您对 SO 问题的回答。祝您编程愉快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2015-10-23
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多