1

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

每个 Highlight 都有一个 HighlightType。因此,如果我运行,user.highlights我可能会看到如下输出:

user.highlights 示例

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

我想要做的是返回这个完整的记录列表,但每个 highlight_type 只包括一个突出显示,我希望那个记录是最近的记录(在这种情况下是“第 50 次运行”突出显示)。因此,在上面的示例中,我会得到相同的结果,但删除了 ID 195-199。

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

4

1 回答 1

1

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

根据该链接中的一项建议,您将执行此 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

on created_atDESC很重要

编辑: 我也看到了一些基于此的建议这 user.highlights.group('highlight_type_id').order('created_at DESC') 也是我最初认为应该解决的方法,但我对其进行了测试,但似乎没有得到正确的结果——至少在我的测试数据上是这样。

于 2012-11-27T00:37:54.420 回答