Com a :limit
consulta, receberei os primeiros N registros. Qual é a maneira mais fácil de obter os últimos N registros?
163
Com a :limit
consulta, receberei os primeiros N registros. Qual é a maneira mais fácil de obter os últimos N registros?
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
fonte
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')
fonte
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á oSELECT 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 aSomeModel.last(5).map(&:col)
qualSELECT *
substituiSELECT col
(você não pode obter depois de chamar último; a cadeia de preguiçoso-final termina com o último).Para Rails 5 (e provavelmente Rails 4)
Ruim:
Porque:
tão:
provavelmente explodirá sua memória ou levará uma eternidade.
Boa abordagem:
Porque:
Este último é um escopo não avaliado. Você pode encadeá-lo ou convertê-lo em uma matriz via
.to_a
. Assim:... leva um segundo.
fonte
Para a versão Rails 4 e superior:
Você pode tentar algo assim: Se você deseja a primeira entrada mais antiga
Você pode tentar algo assim se quiser as últimas entradas mais recentes .
fonte
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
porque é o mesmo queYourModel.order()
A solução está aqui:
Como o rails é preguiçoso, ele eventualmente atingirá o banco de dados com SQL como: "SELECT
table
. * FROMtable
ORDER BYtable
.id
DESC LIMIT 5".fonte
SomeModel
SELECT
table.* FROM
table` ORDER BYtable
.id
DESC LIMIT 5` não executa um select allSe você precisar definir alguns pedidos para os resultados, use:
se você não precisa de nenhum pedido e precisa apenas de registros salvos na tabela, use:
fonte
No meu
(rails 4.2)
projeto rails , eu usoe funciona.
fonte
podemos usar
Model.last(5)
ouModel.limit(5).order(id: :desc)
em trilhos 5.2fonte
Apenas tente:
fonte
Acho que essa consulta é melhor / mais rápida para usar o método "arrancar", que eu amo:
Isso fornece um ActiveRecord como a saída; então você pode usar o .pluck assim:
que fornece rapidamente os IDs como uma matriz enquanto usa o código SQL ideal.
fonte
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:
ou
fonte
Digamos N = 5 e seu modelo é
Message
, você pode fazer algo assim:Veja o sql:
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.
fonte
Adicione um parâmetro: order à consulta
fonte