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

标签 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

然后这样查询->

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/

相关文章:

ruby-on-rails - Capistrano中没有部署此类文件或目录

ruby-on-rails - 如何使用 Faye 检测 channel 上的断开事件

SQL如何选择某人发布的最新评论

regex - 两种模式之间的 Postgres regexp_matches

mysql - SQL-如何在 NOT EXIST 语句中显示以 3 秒开头的每个帐户的结果(例如 300,301, 302..)?

SQL,略微扭曲获取每个日期的计数

ruby-on-rails - 我的代码库中的这个 ActiveRecord/SQL 语句是否容易受到 SQL 注入(inject)的影响?

postgresql - PostgreSQL中的"Abstract"表(继承)

java - 从 JOOQ 解析器结果中获取表/列元数据

Mysql - 在 "one to many"表中搜索