Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 返回一组半唯一的最新记录_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 返回一组半唯一的最新记录

Ruby on rails 返回一组半唯一的最新记录,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,在我的应用程序中,用户有亮点 每个高光都有一个HighlightType。因此,如果我运行user.highlights,我可能会看到如下输出: 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 hi

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

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

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

请注意,有许多类型为_id 47的高亮显示。这标志着用户运行次数的里程碑

我想做的是返回这个完整的记录列表,但是对于每种突出显示类型只包含一个突出显示,我希望这一条记录是最近的记录(在本例中是“第50次运行”突出显示)。因此,在上面的例子中,我将得到相同的结果,但删除ID195-199


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

我认为没有一种简单或干净的方法来实现这一点,也没有“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
创建时的
DESC
非常重要

编辑: 我也看到了一些基于此的建议
user.highlights.group('highlight_type_id')。order('created_at DESC')

这也是我第一次认为应该解决的问题,但我测试了它,似乎没有得到正确的结果——至少在我的测试数据上是这样。

我认为没有一种简单或干净的方法来实现这一点,也没有“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
创建时的
DESC
非常重要

编辑: 我也看到了一些基于此的建议
user.highlights.group('highlight_type_id')。order('created_at DESC')

这也是我第一次认为应该解决的问题,但我测试了它,但似乎没有得到正确的结果——至少在我的测试数据上是这样。

您是否尝试过
user.highlights.group('highlight\u type\u id')
?这似乎“起作用”,但我不确定它实际上在做什么。组确实会为每个突出显示类型id返回一条记录,但我不确定它使用什么逻辑来选择特定的记录。正如244an所建议的,当user.highlights.group('highlight_type_id').order('created_at DESC')之类的东西不能按预期工作时,因为排序是在分组之后完成的。如果我能理解小组选择记录背后的逻辑,我会对这种方法更有信心。您是否尝试过
user.highlights.group('highlight\u type\u id')
?这似乎“有效”,但我不确定它实际上在做什么。组确实会为每个突出显示类型id返回一条记录,但我不确定它使用什么逻辑来选择特定的记录。正如244an所建议的,当user.highlights.group('highlight_type_id').order('created_at DESC')之类的东西不能按预期工作时,因为排序是在分组之后完成的。如果我能理解团队选择记录背后的逻辑,我会对这种方法更有信心。这里有很多要点。我喜欢你的第二个建议,因为它很容易理解。一个典型的用户将有约50条高亮记录,在上限处,这可能达到约200条记录。你知道这是否会影响性能吗?同样对于我的特殊情况,我正在考虑在表中添加一个标记,标记突出显示类型id的旧记录。然后我可以过滤掉这些记录。看起来是个更干净的解决方案,是吗?不管是哪种方式,我们都很好奇是否有一种干净、高效的方法可以解决这个问题,不知道你用的是什么服务器,但我们的服务器已经使用了4年。在某些地方,我们将高达20000 db行的结果作为模型对象处理,而不存在内存问题。就性能而言,只要它是几百行,我想你不会注意到它是一行还是几百行。使用标志似乎是一种“干净”的解决方案,但这取决于该标志始终是正确的。我个人会使用“散列解决方案”。我认为“加入解决方案”可能会有糟糕的性能。我也很好奇是否有一个干净优雅的解决方案,我的建议是一种穷人的解决方案:)这里的要点很好。我喜欢你的第二个建议,因为它很容易理解。一个典型的用户将有约50条高亮记录,在上限处,这可能达到约200条记录。你知道这是否会影响性能吗?同样对于我的特殊情况,我正在考虑在表中添加一个标记,标记突出显示类型id的旧记录。然后我可以过滤掉这些记录。看起来是个更干净的解决方案,是吗?不管是哪种方式,我们都很好奇是否有一种干净、高效的方法可以解决这个问题,不知道你用的是什么服务器,但我们的服务器已经使用了4年。在某些地方,我们将高达20000 db行的结果作为模型对象处理,而不存在内存问题。就性能而言,只要它是几百行,我想你不会注意到它是一行还是几百行。使用标志似乎是一种“干净”的解决方案,但这取决于该标志始终是正确的。我个人会使用“散列解决方案”。我认为“加入解决方案”可能会有糟糕的性能。我也很好奇是否有一个干净优雅的解决方案,我的建议是一种穷人的解决方案:)