Respuestas:
Creo que una consulta de registro activa como esta le daría lo que desea ('Algo' es el nombre del modelo):
Something.find(:all, :order => "id desc", :limit => 5).reverse
editar : como se señaló en los comentarios, otra forma:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Este es el camino de 3 carriles
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
. El enfoque correcto es SomeModel.limit(5).order('id desc')
por Arthur Neves, lo que resulta enSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
nueva forma de hacerlo en rails 3.1 es SomeModel.limit(5).order('id desc')
last(5)
porque devuelve un alcance para un mayor encadenamiento.
SomeModel.limit(100).reverse_order
en Rails 4 ( guides.rubyonrails.org/… ) Es lo mismo.
SomeModel.limit(5).order('id desc').pluck(:col)
lo hará SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
es mucho más eficiente que tomar todas las columnas y descartar todas las columnas, excepto una, con lo SomeModel.last(5).map(&:col)
que hace en SELECT *
lugar de SELECT col
(no puede extraer después de llamar last; lazy-eval chain finaliza con last).
Something.last(5)
porque:
Something.last(5).class
=> Array
entonces:
Something.last(50000).count
probablemente explotará tu memoria o tardará una eternidad.
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 es un alcance no evaluado. Puede encadenarlo o convertirlo en una matriz mediante .to_a
. Entonces:
Something.limit(50000).order('id desc').count
... toma un segundo.
Para Rails 4 y versiones superiores:
Puedes probar algo como esto si quieres la primera entrada más antigua
YourModel.order(id: :asc).limit(5).each do |d|
Puede probar algo como esto si desea las últimas últimas entradas .
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
porque es lo mismo queYourModel.order()
La solución está aquí:
SomeModel.last(5).reverse
Como los rieles son perezosos, eventualmente llegará a la base de datos con SQL como: "SELECCIONAR table
. * DESDE table
ORDENAR POR table
. id
LÍMITE DESC 5".
SomeModel
SELECT
table .* FROM
table` ORDER BY table
. id
DESC LIMIT 5` no realiza una selección de todo
podemos usar Model.last(5)
o Model.limit(5).order(id: :desc)
en rieles 5.2
Encuentro que esta consulta es mejor / más rápida para usar el método "pluck", que me encanta:
Challenge.limit(5).order('id desc')
Esto le da un ActiveRecord como salida; para que pueda usar .pluck de esta manera:
Challenge.limit(5).order('id desc').pluck(:id)
que proporciona rápidamente los identificadores como una matriz mientras se utiliza un código SQL óptimo.
Challenge.limit(5).order('id desc').ids
funcionará igual de bien :)
Si tiene un alcance predeterminado en su modelo que especifica un orden ascendente en Rails 3, deberá usar el reordenamiento en lugar del orden especificado por Arthur Neves arriba:
Something.limit(5).reorder('id desc')
o
Something.reorder('id desc').limit(5)
Digamos N = 5 y su modelo es Message
, puede hacer algo como esto:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Mira el sql:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
La clave es la subselección. Primero necesitamos definir cuáles son los últimos mensajes que queremos y luego tenemos que ordenarlos en orden ascendente.
Agregue un parámetro de orden a la consulta