在:limit
查询中,我将获得前 N 条记录。获取最后 N 条记录的最简单方法是什么?
15 回答
这是 Rails 3 方式
SomeModel.last(5) # last 5 records in ascending order
SomeModel.last(5).reverse # last 5 records in descending order
更新答案 (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
在 rails 3.1 中执行此操作的新方法是SomeModel.limit(5).order('id desc')
对于 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
......需要一秒钟。
对于Rails 4 及以上版本:
你可以尝试这样的事情如果你想要第一个最旧的条目
YourModel.order(id: :asc).limit(5).each do |d|
如果你想要最后的最新条目,你可以尝试这样的事情..
YourModel.order(id: :desc).limit(5).each do |d|
解决方案在这里:
SomeModel.last(5).reverse
由于 rails 是惰性的,它最终会使用 SQL 访问数据库,例如:“SELECT table
.* FROM table
ORDER BY table
. id
DESC LIMIT 5”。
如果您需要对结果设置一些排序,请使用:
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
它有效。
我们可以在 rails 5.2中使用Model.last(5)
orModel.limit(5).order(id: :desc)
我发现这个查询对于使用我喜欢的“pluck”方法来说更好/更快:
Challenge.limit(5).order('id desc')
这给出了一个 ActiveRecord 作为输出;所以你可以像这样使用 .pluck :
Challenge.limit(5).order('id desc').pluck(:id)
在使用最佳 SQL 代码的同时快速将 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
关键是子选择。首先,我们需要定义我们想要的最后一条消息是什么,然后我们必须按升序对它们进行排序。
如果您的模型中有一个默认范围指定 Rails 3 中的升序,您将需要使用 reorder 而不是上面 Arthur Neves 指定的 order:
Something.limit(5).reorder('id desc')
或者
Something.reorder('id desc').limit(5)
一个简单的答案是:
Model.limit(5).order(id: :desc)
这个解决方案有一个问题,因为id
它不能成为当时创建记录的唯一决定因素。
更可靠的解决方案是:
Model.order(created_at: :desc).limit(5)
正如其他人指出的那样,也可以使用Model.last(5)
. 唯一的问题是它返回Array
,而不是Model::ActiveRecord_Relation
。
在查询中添加 :order 参数