如何在RoR中包含最后更新的行

时间:2015-06-17 07:44:28

标签: sql ruby-on-rails postgresql

所以我有两个模型CategoryTopic,任何类别都可以有很多主题。

问题是,如何查询所有类别并包含每个类别的最新更新主题?

如果我这样做

class Category < ActiveRecord::Base
  has_many :topics
  has_one :last_updated_topic, -> {order(updated_at: :desc)}, class_name: 'Topic'
end

和查询一样 - &gt;

Category.all.includes(:last_updated_topic)

然后它可以工作,但令我害怕的是,我有一个SQL查询加载这样的主题:

SELECT "topics".* FROM "topics" WHERE "topics"."category_id" IN (1, 2, 3)  ORDER BY "topics"."updated_at" DESC

因此它会加载所有主题,当我只需要每个类别的最新更新主题时,可以有数千个主题。

所以我想知道是否有一种简单的方法可以在不编写自定义SQL的情况下解决此问题,或者我是否对某些内容有误?

我应该使用它吗? - &GT;

SELECT categories.*, t.title as last_topic_title FROM "categories" LEFT JOIN (SELECT topics.* FROM topics ORDER BY topics.updated_at DESC LIMIT 1) t ON categories.id = t.category_id

1 个答案:

答案 0 :(得分:-1)

您可以使用内部查询:

has_one :last_updated_topic, -> { where(updated_at: Topic.maximum(:updated_at)), class_name: 'Topic'