181

:limit查询中,我将获得前 N 条记录。获取最后 N 条记录的最简单方法是什么?

4

15 回答 15

271

这是 Rails 3 方式

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

SomeModel.last(5).reverse # last 5 records in descending order
于 2012-01-27T08:37:42.703 回答
170

更新答案 (2020)

您只需使用last方法即可获取最后 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
于 2009-01-07T14:07:43.490 回答
53

在 rails 3.1 中执行此操作的新方法是SomeModel.limit(5).order('id desc')

于 2011-12-16T05:52:29.947 回答
45

对于 Rails 5(可能还有 Rails 4)

坏的:

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

......需要一秒钟。

于 2017-07-26T18:28:24.450 回答
33

对于Rails 4 及以上版本:

你可以尝试这样的事情如果你想要第一个最旧的条目

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

如果你想要最后的最新条目,你可以尝试这样的事情..

YourModel.order(id: :desc).limit(5).each do |d|
于 2014-07-09T08:45:24.630 回答
26

解决方案在这里:

SomeModel.last(5).reverse

由于 rails 是惰性的,它最终会使用 SQL 访问数据库,例如:“SELECT table.* FROM table ORDER BY table. idDESC LIMIT 5”。

于 2010-09-08T16:24:11.413 回答
4

如果您需要对结果设置一些排序,请使用:

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

如果您不需要任何排序,并且只需要保存在表中的记录,则使用:

Model.last(n) # n= any number
于 2015-02-14T08:40:27.450 回答
4

你试一试:

Model.order("field_for_sort desc").limit(5)
于 2016-05-04T15:54:59.747 回答
4

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

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

它有效。

于 2016-07-10T13:46:20.803 回答
3

我们可以在 rails 5.2中使用Model.last(5)orModel.limit(5).order(id: :desc)

于 2019-11-05T07:11:49.103 回答
1

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

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

这给出了一个 ActiveRecord 作为输出;所以你可以像这样使用 .pluck :

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

在使用最佳 SQL 代码的同时快速将 id 作为数组提供。

于 2015-01-21T19:29:57.320 回答
1

假设 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

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

于 2016-08-22T00:22:00.567 回答
0

如果您的模型中有一个默认范围指定 Rails 3 中的升序,您将需要使用 reorder 而不是上面 Arthur Neves 指定的 order:

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

或者

Something.reorder('id desc').limit(5)
于 2014-12-18T17:06:07.873 回答
0

一个简单的答案是:

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

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

更可靠的解决方案是:

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

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

于 2021-06-10T09:48:12.953 回答
-5

在查询中添加 :order 参数

于 2009-01-07T13:52:31.960 回答