在我的应用程序中,用户有亮点。
每个精彩集锦都有一个HighlightType。因此,如果我运行user.highlights
,我可能会看到这样的输出:
请注意,type_id 47有很多亮点。这标志着用户运行次数的里程碑。
我想要做的是返回完整的记录列表,但每个highlight_type只包含一个突出显示,我希望那条记录成为最新记录(在本例中为“第50次运行”突出显示)。所以在上面的示例中,我会得到相同的结果,但删除了ID 195-199。
有没有一种有效的方法来实现这一目标?
答案 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')
这也是我第一次认为它应该被解决的方式,但我测试了它并没有得到正确的结果 - 至少在我的测试数据上。