Mysql 每组最大n个rails ActiveRecord SQL

Mysql 每组最大n个rails ActiveRecord SQL,mysql,sql,ruby-on-rails,activerecord,greatest-n-per-group,Mysql,Sql,Ruby On Rails,Activerecord,Greatest N Per Group,我有一个ActiveRecordmodelPost,其中包含在和score创建的字段。我想在最近创建的50篇文章中按分数排序文章。所以基本上SQL是 SELECT * FROM (SELECT * FROM Posts ORDER BY created_at DESC LIMIT 50) Sorted_Posts ORDER BY score DESC 不幸的是,我不知道如何在Rails中做到这一点。我不喜欢使用原始SQL来实现这一点,因为查询中有许多过滤器和其他东西没有显示出来,这会使原始S

我有一个
ActiveRecord
model
Post
,其中包含在
score
创建的
字段。我想在最近创建的50篇文章中按分数排序
文章。所以基本上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\u by_sql
函数中,但我觉得这可能是黑客行为,可能导致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)

谢谢你的建议,但我尝试了这个,根据文档,它遵循SQL查询的标准模型。所以它产生的实际上是
SELECT*FROM Posts ORDER,由DESC创建,score DESC LIMIT 50