如何获得主动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参数添加到查询中