Ruby on rails ActiveRecord返回每个用户的最新记录(唯一)

Ruby on rails ActiveRecord返回每个用户的最新记录(唯一),ruby-on-rails,ruby,postgresql,activerecord,ruby-on-rails-4,Ruby On Rails,Ruby,Postgresql,Activerecord,Ruby On Rails 4,我有一个用户模型和一个卡片模型。用户有很多卡片,所以卡片有一个属性User\u id 我想为每个用户获取最新的单卡。我已经能够做到这一点: Card.all.order(:user_id, :created_at) # => gives me all the Cards, sorted by user_id then by created_at Card.select('user_id, max(created_at)').group('user_id') # => gives m

我有一个用户模型和一个卡片模型。用户有很多卡片,所以卡片有一个属性User\u id

我想为每个用户获取最新的单卡。我已经能够做到这一点:

Card.all.order(:user_id, :created_at)
# => gives me all the Cards, sorted by user_id then by created_at
Card.select('user_id, max(created_at)').group('user_id')
# => gives me user_id and created_at
这让我走了一半,我当然可以遍历这些行,并为每个用户获取第一行。但这对我来说真的很糟糕,因为我会用Ruby中的数组做很多这样的事情

我也可以这样做:

Card.all.order(:user_id, :created_at)
# => gives me all the Cards, sorted by user_id then by created_at
Card.select('user_id, max(created_at)').group('user_id')
# => gives me user_id and created_at
…但我只返回用户ID并在时间戳处创建。我无法选择包括id在内的任何其他列,因此我得到的内容一文不值。我也不明白为什么PG不允许我选择比上面更多的列,而不将它们放入group_by或聚合函数中

我更愿意找到一种只使用ActiveRecord就可以得到我想要的东西的方法。我也愿意用原始SQL编写这个查询,但如果我不能用AR完成的话。顺便说一句,我使用的是Postgres DB,这限制了我的一些选择


谢谢大家。

我们加入了卡牌桌,在桌上

第一个身份证!=二把手 b first.user\u id=second.user\u id c第一次创建时间<第二次创建时间


我发现了一种性能不理想的解决方案,但在时间较短或是业余爱好项目时,它适用于非常小的数据集:

Card.all.order(:user_id, :created_at).to_a.uniq(&:user_id)
这将获取AR:Relation结果,将其强制转换到Ruby数组中,然后使用Proc对结果执行Arrayuniq。经过一些简短的测试后,似乎uniq将保持秩序,所以只要在使用uniq之前一切正常,您应该是好的


该功能对时间敏感,因此我现在将使用它,但我将在@Gene的响应和链接后查看原始SQL中的某些内容。

关于Card.all.order:user\u id、:created\u at.first或Card.all.order:user\u id.order:created\u at。first@Bala我想为所有制作过卡的用户提供每个用户的最新卡。这只会为ID最低的用户提供最新的卡,该用户至少有一张卡。哪张卡的ID最低?只需将:desc添加到:created_atI我很确定这是AR ORM没有足够的电源的情况之一,您需要通过sql删除以查找_。有关所需的SQL,请参阅及其副本。我遇到了一个相关的问题,最终需要维护一个包含最后记录ID的表,以使查询足够快,尽管我需要的是最后K,而不是最后1。您可以在链接的讨论中看到,对于一百万条记录,查询需要ooo几分钟。@Bala这仍然只会返回一条记录。如果我有10个用户,并且每个用户至少制作了一张卡,我想为每个用户获得最新的卡。因此,查询应该返回10张卡片,而不是1张。得到以下错误:PG::DatatypeMismatch:error:HAVING的参数必须是类型boolean,而不是没有时区行的类型timestamp 1:…T Cards.*来自Cards GROUP BY user_id HAVING MAXcreate…实际上我自己已经测试过了,它运行时没有错误,我已经用另一种方法更新了解决方案,但这种方法不适用于Postgres。第一个命令给我一个PG::DatatypeMismatch:ERROR:,第二个命令给我一个PG::GroupingError:ERROR:。没有给我每个用户一张卡。我不知道为什么这会超出性能。有人有什么想法吗?可能是性能,并使其在结果中浮到底部?我刚刚测试了你上面的答案,它确实有效。您收到的错误可能是由于您使用的数据类型存在问题。我只是在另一个答案中使用了代码,效果很好。@gregb这是因为来这里寻找答案的人希望通过AR让SQL完成繁重的工作,但他们对问题标题误导了所选答案感到失望