返回一组半独特的最新记录

时间:2012-11-26 20:17:20

标签: ruby-on-rails activerecord

在我的应用程序中,用户有亮点。

每个精彩集锦都有一个HighlightType。因此,如果我运行user.highlights,我可能会看到这样的输出:

example of user.highlights

请注意,type_id 47有很多亮点。这标志着用户运行次数的里程碑。

我想要做的是返回完整的记录列表,但每个highlight_type只包含一个突出显示,我希望那条记录成为最新记录(在本例中为“第50次运行”突出显示)。所以在上面的示例中,我会得到相同的结果,但删除了ID 195-199。

有没有一种有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

我认为没有一种简单或干净的方法可以实现这一目标,也不是“Rails方式”。看看例如这link

根据link中的一个建议,您将执行此SQL请求:

SELECT h1.*
FROM highlights h1
LEFT JOIN highlights h2
 ON (h1.user_id = h2.user_id 
     AND h1.highlight_type_id = h2.highlight_type_id
     AND h1.created_at < h2.created_at)
WHERE h2.id IS NULL AND h1.user_id = <the user id you are interested in>
group by h1.highlight_type_id

我认为如果你有大桌可能会有一些性能问题,我认为它不是那么干净。

否则,如果用户没有那么多亮点,我会做这样的事情:

rows = {}
user.highlights.order('highlight_type_id, created_at DESC').each do |hi|
  rows[hi.highlight_type_id] ||= hi
end
# then use rows which will have one object for each highlight_type_id

created_at上的DESC很重要

修改 我也看到了一些基于此的建议 user.highlights.group('highlight_type_id').order('created_at DESC') 这也是我第一次认为它应该被解决的方式,但我测试了它并没有得到正确的结果 - 至少在我的测试数据上。