如何获得主动logging的最后N个logging?

:limit在查询中,我会得到第N个logging。 获得最后N个logging的最简单方法是什么?

像这样的活动logging查询,我想会得到你想要的('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的方式

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

在轨道3.1中做的新方法是SomeModel.limit(5).order('id desc')

解决scheme在这里:

 SomeModel.last(5).reverse 

由于rails是懒惰的,它最终将用SQL打到数据库,如:“SELECT table 。* FROM table ORDER BY table。id DESC LIMIT 5”。

对于Rails 4及以上版本:

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

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

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

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

如果您需要对结果进行sorting,请使用:

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

如果你不需要任何订购,只需要保存在表中的logging,然后使用:

 Model.last(n) # n= any number 

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

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

它的工作。

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

…需要一秒钟。

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

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

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

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

当使用最佳的SQL代码时,它可以快速地将ID作为一个数组。

你试一试:

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

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

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

要么

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

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

关键是子select。 首先,我们需要定义我们想要的最后的消息,然后我们必须按照升序来sorting。

将一个:order参数添加到查询中