如何使用activerecord获取最后N条记录?

时间:2009-01-07 13:47:54

标签: ruby-on-rails ruby activerecord

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

15 个答案:

答案 0 :(得分:252)

这是Rails 3方式

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

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

答案 1 :(得分:139)

像这样的有效记录查询我认为可以得到你想要的东西('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

答案 2 :(得分:50)

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

答案 3 :(得分:28)

Rails 4及以上版本:

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

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

如果您想要最新的最新条目 ..

,您可以尝试这样的方法
YourModel.order(id: :desc).limit(5).each do |d|

答案 4 :(得分:25)

解决方案在这里:

SomeModel.last(5).reverse

由于rails是懒惰的,它最终将使用SQL命中数据库:“SELECT table。* FROM table ORDER BY tableid DESC LIMIT 5”

答案 5 :(得分:20)

对于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

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

答案 6 :(得分:4)

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

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

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

Model.last(n) # n= any number

答案 7 :(得分:4)

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

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

它有效。

答案 8 :(得分:1)

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

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

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

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

在使用最佳SQL代码时会快速将ID作为数组提供。

答案 9 :(得分:1)

试试吧:

Model.all.order("id asc").limit(5)

答案 10 :(得分:1)

我们可以在Rails 5.2中使用import requests import bs4 url = 'https://so.gushiwen.org/guwen/bookv_3694.aspx' doc=requests.get(url) print(bs4.BeautifulSoup(doc.text, "html.parser")) Model.last(5)

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:0)

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

关键是子选择。首先,我们需要定义我们想要的最后消息,然后我们必须按升序排序。

答案 13 :(得分:0)

一个简单的答案是:

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

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

更可靠的解决方案是:

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

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

答案 14 :(得分:-4)

在查询中添加:order参数