在某些情况下,您可能需要按组找到每个最大的n,这在ActiveRecord中的默认排序和调用.limit()会使问题变得复杂。
为此,我们可以使用子查询来减少混乱。下面是一些实现这一点的示例代码:
# 查找每个类别的最新文章 (每个类别最多5篇)
subquery = Article.select("id, category_id, created_at, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY created_at DESC) as row_number").to_sql
articles = Article.joins("INNER JOIN (#{subquery}) sub ON sub.id = articles.id")
.where("sub.row_number <= ?", 5)
.order("sub.category_id, sub.created_at DESC")
此解决方法使用了两个查询:第一个查询使用ROW_NUMBER()函数为每个分类计算文章的行号,并将它们存储在名为subquery的字符串变量中。第二个查询使用INNER JOIN将主查询“articles”与子查询“subquery”组合,并在内部过滤出每个分类的前5篇文章,然后按分类和创建时间进行排序。
这个问题的解决方法可能比其他解决方案要复杂,但它为我们提供了更细粒度的控制,使问题变得更加简单。