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

JtR*_*JtR 156 ruby activerecord ruby-on-rails

随着:limit查询,我会得到前N个记录.获得最后N条记录的最简单方法是什么?

Bon*_*ngs 256

这是Rails 3的方式

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

SomeModel.last(5).reverse # last 5 records in descending order
Run Code Online (Sandbox Code Playgroud)

  • 它完全符合它的要求:`SELECT"items".*FROM"items"ORDER BY id DESC LIMIT 50` (14认同)
  • 在Rails 4中,.last()生成的查询也是Nick提到的最佳查询 (7认同)
  • 注意:这不是一种实现它的好方法,性能方面 - 至少不是Rails 3.1.SomeModel.last(5)将执行没有限制的select语句,将SomeModel的所有记录作为数组返回到Ruby,之后Ruby将挑选出最后的(5)元素.效率方面,目前,您希望使用限制 - 特别是如果您有潜在的许多元素. (5认同)
  • 用Postgres试试吧!我肯定先遇到麻烦.在SQL中,除非您指定顺序,否则无法保证顺序,但MySQL更宽容. (4认同)

Dan*_*vin 140

像这样的活动记录查询我认为可以得到你想要的东西('Something'是模型名称):

Something.find(:all, :order => "id desc", :limit => 5).reverse
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述,另一种方式:

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

while !result.empty?
        puts result.pop
end
Run Code Online (Sandbox Code Playgroud)

  • 不推荐调用#find(:all).直接调用#all. (3认同)

Art*_*ves 50

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

  • 这比`last(5)`更好,因为它返回了进一步链接的范围. (14认同)
  • 我在Rails 4上使用`SomeModel.limit(100).reverse_order`(http://guides.rubyonrails.org/active_record_querying.html#reverse-order)它是一样的. (3认同)

Gag*_*ami 32

对于Rails 4及以上版本:

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

YourModel.order(id: :asc).limit(5).each do |d|
Run Code Online (Sandbox Code Playgroud)

如果你想要最新的参赛作品,你可以试试这样的东西.

YourModel.order(id: :desc).limit(5).each do |d|
Run Code Online (Sandbox Code Playgroud)

  • Order()返回所有记录.不需要链接`YourModel.all.order()`因为它与`YourModel.order()相同` (2认同)

Ami*_*ana 29

对于Rails 5(可能是Rails 4)

坏:

Something.last(5)
Run Code Online (Sandbox Code Playgroud)

因为:

Something.last(5).class
=> Array
Run Code Online (Sandbox Code Playgroud)

所以:

Something.last(50000).count
Run Code Online (Sandbox Code Playgroud)

可能会炸毁你的记忆或永远消失.

好方法:

Something.limit(5).order('id desc')
Run Code Online (Sandbox Code Playgroud)

因为:

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"
Run Code Online (Sandbox Code Playgroud)

后者是一个未评估的范围.您可以链接它,或通过它将其转换为数组.to_a.所以:

Something.limit(50000).order('id desc').count
Run Code Online (Sandbox Code Playgroud)

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


Dev*_*per 24

解决方案在这里:

SomeModel.last(5).reverse
Run Code Online (Sandbox Code Playgroud)

"选择:由于轨道是懒惰的,它最终会与像SQL访问数据库 table*FROM.table ORDER BY table.idDESC LIMIT 5".

  • @Developer是绝对正确的。执行的SQL是:`SELECT`table`。* FROM`table` ORDER BY`table`.`id` DESC LIMIT 5` **不**全选 (2认同)