Answers:
我认为这样的活动记录查询可以为您提供所需的信息(“名称”是模型名称):
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
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
== Array
。正确的方法是SomeModel.limit(5).order('id desc')
根据亚瑟·内维斯(Arthur Neves)的说法,这将导致SELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
在Rails 3.1中做到这一点的新方法是 SomeModel.limit(5).order('id desc')
last(5)
因为它返回进一步链接的范围更好。
SomeModel.limit(100).reverse_order
在Rails 4(guides.rubyonrails.org/…)上使用相同。
SomeModel.limit(5).order('id desc').pluck(:col)
会做SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
比抓住所有列,并丢弃所有,但一列以更有效SomeModel.last(5).map(&:col)
,其确实SELECT *
而不是SELECT col
(你不能调用后摘去last;惰性评估链以last结尾)。
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|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
因为与YourModel.order()
解决方案在这里:
SomeModel.last(5).reverse
由于轨是懒惰的,它最终将击中像SQL数据库: “SELECT table
* FROM。table
ORDER BY table
。id
DESC LIMIT 5”。
SomeModel
SELECT
table .* FROM
table` ORDER BY table
。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
关键是子选择。首先,我们需要定义我们想要的最后一条消息,然后我们必须按升序对其进行排序。