在查询中使用:limit
,我将获得前N个记录。获得最后N条记录的最简单方法是什么?
答案 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 table
。id
DESC LIMIT 5”
答案 5 :(得分:20)
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参数