所以我有两个模型,Category
和 Topic
,任何类别都可以有很多主题。
问题是,如何查询所有类别并包含每个类别的最后更新主题?
如果我这样做
class Category < ActiveRecord::Base
has_many :topics
has_one :last_updated_topic, -> {order(updated_at: :desc)}, class_name: 'Topic'
end
然后这样查询->
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 的情况下解决这个问题,或者我是否错了什么?
我应该改用这个吗? ->
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
最佳答案
您可以使用内部查询:
has_one :last_updated_topic, -> { where(updated_at: Topic.maximum(:updated_at)), class_name: 'Topic'
关于sql - 如何在 RoR 中包含最后更新的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30885309/