每组最大 n rails ActiveRecord SQL
Greatest-n-per-group rails ActiveRecord SQL
我有一个 ActiveRecord
模型 Post
,其中包含字段 created_at
和 score
。我想在最近创建的 50 个中按分数排序 Posts
。所以基本上 SQL 会是
SELECT * FROM
(SELECT * FROM Posts ORDER BY created_at DESC LIMIT 50) Sorted_Posts
ORDER BY score DESC
不幸的是,我不确定如何在 Rails 中执行此操作。我不喜欢使用原始 SQL 来完成此操作,因为查询中有许多未显示的过滤器和其他内容确实会使原始 SQL 复杂化。我研究过是否可以使用 to_sql
并去掉 SELECT * FROM POSTS
前缀然后将其放入 where
或 find_by_sql
函数中,但我觉得这可能是 hacky 并可能导致SQL 注射?
谢谢。
试试这个:
Post.order('created_at DESC').limit(50).order('score DESC')
不确定这是否适用于您的用例,但这是完成您的要求的一种方法
Post.from("(#{Post.order('created_at DESC').limit(50).to_sql}) posts").order('score DESC')
本质上,您是在构建内部查询,然后将其转换为 SQL 文字并使用插值将其放入外部查询的 from 部分。
也许是这样的:
Order.where(id: Order.order(:created_at => :desc).limit(50).ids).order(:score => :desc)
我有一个 ActiveRecord
模型 Post
,其中包含字段 created_at
和 score
。我想在最近创建的 50 个中按分数排序 Posts
。所以基本上 SQL 会是
SELECT * FROM
(SELECT * FROM Posts ORDER BY created_at DESC LIMIT 50) Sorted_Posts
ORDER BY score DESC
不幸的是,我不确定如何在 Rails 中执行此操作。我不喜欢使用原始 SQL 来完成此操作,因为查询中有许多未显示的过滤器和其他内容确实会使原始 SQL 复杂化。我研究过是否可以使用 to_sql
并去掉 SELECT * FROM POSTS
前缀然后将其放入 where
或 find_by_sql
函数中,但我觉得这可能是 hacky 并可能导致SQL 注射?
谢谢。
试试这个:
Post.order('created_at DESC').limit(50).order('score DESC')
不确定这是否适用于您的用例,但这是完成您的要求的一种方法
Post.from("(#{Post.order('created_at DESC').limit(50).to_sql}) posts").order('score DESC')
本质上,您是在构建内部查询,然后将其转换为 SQL 文字并使用插值将其放入外部查询的 from 部分。
也许是这样的:
Order.where(id: Order.order(:created_at => :desc).limit(50).ids).order(:score => :desc)