Respostas:
Uma consulta de registro ativo como esta, acho que conseguiria o que você deseja ('Something' é o nome do modelo):
Something.find(:all, :order => "id desc", :limit => 5).reverse
editar : Conforme observado nos comentários, de outra maneira:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Esta é a maneira 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
. A abordagem correta é SomeModel.limit(5).order('id desc')
por Arthur Neves, o que resulta emSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
nova maneira de fazê-lo no Rails 3.1 é SomeModel.limit(5).order('id desc')
last(5)
porque retorna um escopo para encadeamento adicional.
SomeModel.limit(100).reverse_order
no Rails 4 ( Guides.rubyonrails.org/… ). É o mesmo.
SomeModel.limit(5).order('id desc').pluck(:col)
fará o SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
que é muito mais eficiente do que pegar todas as colunas e descartar todas, exceto uma coluna com a SomeModel.last(5).map(&:col)
qual SELECT *
substitui SELECT col
(você não pode obter depois de chamar último; a cadeia de preguiçoso-final termina com o último).
Something.last(5)
Porque:
Something.last(5).class
=> Array
tão:
Something.last(50000).count
provavelmente explodirá sua memória ou levará uma eternidade.
Something.limit(5).order('id desc')
Porque:
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"
Este último é um escopo não avaliado. Você pode encadeá-lo ou convertê-lo em uma matriz via .to_a
. Assim:
Something.limit(50000).order('id desc').count
... leva um segundo.
Para a versão Rails 4 e superior:
Você pode tentar algo assim: Se você deseja a primeira entrada mais antiga
YourModel.order(id: :asc).limit(5).each do |d|
Você pode tentar algo assim se quiser as últimas entradas mais recentes .
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
porque é o mesmo queYourModel.order()
A solução está aqui:
SomeModel.last(5).reverse
Como o rails é preguiçoso, ele eventualmente atingirá o banco de dados com SQL como: "SELECT table
. * FROM table
ORDER BY table
. id
DESC LIMIT 5".
SomeModel
SELECT
table .* FROM
table` ORDER BY table
. id
DESC LIMIT 5` não executa um select all
podemos usar Model.last(5)
ou Model.limit(5).order(id: :desc)
em trilhos 5.2
Acho que essa consulta é melhor / mais rápida para usar o método "arrancar", que eu amo:
Challenge.limit(5).order('id desc')
Isso fornece um ActiveRecord como a saída; então você pode usar o .pluck assim:
Challenge.limit(5).order('id desc').pluck(:id)
que fornece rapidamente os IDs como uma matriz enquanto usa o código SQL ideal.
Challenge.limit(5).order('id desc').ids
vai funcionar tão bem :)
Se você tem um escopo padrão no seu modelo que especifica uma ordem crescente no Rails 3, precisará usar o reordenamento em vez da ordem, conforme especificado por Arthur Neves acima:
Something.limit(5).reorder('id desc')
ou
Something.reorder('id desc').limit(5)
Digamos N = 5 e seu modelo é Message
, você pode fazer algo assim:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Veja o sql:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
A chave é a subseleção. Primeiro, precisamos definir quais são as últimas mensagens que queremos e depois temos que ordená-las em ordem crescente.
Adicione um parâmetro: order à consulta