我不认为有一个简单或干净的方法来实现这一点,也没有“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')
这也是我第一次以为应该解决的问题,但我测试了它,似乎没有得到一个正确的结果 - 至少在我的测试数据。
你有没有试过'user.highlights.group('highlight_type_id')'? – MrYoshiji
这似乎是“工作”,但我不确定它实际上在做什么。 GROUP不会为每个highlight_type_id返回一条记录,但我不确定它使用什么逻辑来选择特定记录。正如244an所暗示的那样,当像user.highlights.group('highlight_type_id').order('created_at DESC')这样的东西不能按预期工作时,因为排序是在分组之后完成的。如果我能理解小组选择记录背后的逻辑,那么我可以对这种方法更有信心。 – pejmanjohn