如何获得最后 N 记录的活动记录?

有了 :limit在查询中,我将得到第一个 N 记录。什么是最简单的方法得到最后 N 记录?

163392 次浏览

向查询添加: order 参数

更新答案(2020)

你可以简单地使用 最后方法得到最后 N 条记录:

Record.last(N)

例如:

User.last(5)

按照 ID 的降序返回5个用户。

弃用(旧答案)

像这样一个活动的记录查询,我认为可以得到您想要的(‘ Something’是模型名称) :

Something.find(:all, :order => "id desc", :limit => 5).reverse

编辑 : 正如评论中指出的,另一种方式:

result = Something.find(:all, :order => "id desc", :limit => 5)


while !result.empty?
puts result.pop
end

解决办法在这里:

SomeModel.last(5).reverse

因为 ails 是惰性的,所以它最终会使用 SQL 命中数据库,比如: “ SELECTtable。* 来自 table的订单由 table.id DESC 极限5”。

在 Rails3.1中的新方法是 SomeModel.limit(5).order('id desc')

这是 Rails 3 way

SomeModel.last(5) # last 5 records in ascending order


SomeModel.last(5).reverse # last 5 records in descending order

对于 Rails 4及以上版本:

你可以尝试这样的东西,如果你想 第一个最古老的记录

YourModel.order(id: :asc).limit(5).each do |d|

你可以尝试这样的东西,如果你想 最后的最新作品. 。

YourModel.order(id: :desc).limit(5).each do |d|

如果你在你的模型中有一个默认的范围,在 Rails 3中指定一个升序,你需要使用 reorder 而不是像 Arthur Neves 指定的那样:

Something.limit(5).reorder('id desc')

或者

Something.reorder('id desc').limit(5)

我发现这个查询对于使用“ pluck”方法更好/更快,我喜欢这个方法:

Challenge.limit(5).order('id desc')

这将提供一个 ActiveRecord 作为输出; 因此您可以像下面这样使用. pluck:

Challenge.limit(5).order('id desc').pluck(:id)

在使用优化的 SQL 代码时,它可以快速地将 id 作为一个数组给出。

如果需要对结果进行排序,请使用:

Model.order('name desc').limit(n) # n= number

如果您不需要任何订购,只需要保存在表中的记录,那么使用:

Model.last(n) # n= any number

试试看:

Model.order("field_for_sort desc").limit(5)

在我的 Rails (rails 4.2)项目中,我使用

Model.last(10) # get the last 10 record order by id

而且成功了。

假设 N = 5,你的模型是 Message,你可以这样做:

Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)

看看这个 sql:

SELECT "messages".* FROM (
SELECT  "messages".* FROM "messages"  ORDER BY "messages"."created_at" DESC LIMIT 5
) messages  ORDER BY "messages"."created_at" ASC

关键是子选择。首先,我们需要定义我们想要的最后一条消息是什么,然后我们必须按升序对它们进行排序。

对于 Rails5(可能是 Rails4)

坏:

Something.last(5)

因为:

Something.last(5).class
=> Array

所以:

Something.last(50000).count

可能会毁掉你的记忆,或者永远消失。

好办法:

Something.limit(5).order('id desc')

因为:

Something.limit(5).order('id desc').class
=> Image::ActiveRecord_Relation


Something.limit(5).order('id desc').to_sql
=> "SELECT  \"somethings\".* FROM \"somethings\" ORDER BY id desc LIMIT 5"

后者是一个未计算的作用域。您可以链接它,或者通过 .to_a将其转换为数组。因此:

Something.limit(50000).order('id desc').count

需要一点时间。

我们可以使用 Model.last(5)Model.limit(5).order(id: :desc)在轨道5.2

一个简单的答案是:

Model.limit(5).order(id: :desc)

这个解决方案存在一个问题,因为 id不能作为当时创建记录的唯一决定因素。

一个更可靠的解决办法是:

Model.order(created_at: :desc).limit(5)

正如其他人指出的那样,人们也可以使用 Model.last(5)。唯一的问题是它返回的是 Array,而不是 Model::ActiveRecord_Relation