Con :limit
in query, obtendré los primeros N registros. ¿Cuál es la forma más fácil de obtener los últimos N registros?
163
Con :limit
in query, obtendré los primeros N registros. ¿Cuál es la forma más fácil de obtener los últimos N registros?
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
fuente
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
==Array
. El enfoque correcto esSomeModel.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')
fuente
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 loSomeModel.last(5).map(&:col)
que hace enSELECT *
lugar deSELECT col
(no puede extraer después de llamar last; lazy-eval chain finaliza con last).Para los rieles 5 (y probablemente los rieles 4)
Malo:
porque:
entonces:
probablemente explotará tu memoria o tardará una eternidad.
Buen enfoque:
porque:
Este último es un alcance no evaluado. Puede encadenarlo o convertirlo en una matriz mediante
.to_a
. Entonces:... toma un segundo.
fuente
Para Rails 4 y versiones superiores:
Puedes probar algo como esto si quieres la primera entrada más antigua
Puede probar algo como esto si desea las últimas últimas entradas .
fuente
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
porque es lo mismo queYourModel.order()
La solución está aquí:
Como los rieles son perezosos, eventualmente llegará a la base de datos con SQL como: "SELECCIONAR
table
. * DESDEtable
ORDENAR PORtable
.id
LÍMITE DESC 5".fuente
SomeModel
SELECT
table.* FROM
table` ORDER BYtable
.id
DESC LIMIT 5` no realiza una selección de todoSi necesita establecer un orden en los resultados, use:
si no necesita ningún pedido y solo necesita guardar registros en la tabla, use:
fuente
En mi
(rails 4.2)
proyecto de rieles , usoy funciona.
fuente
podemos usar
Model.last(5)
oModel.limit(5).order(id: :desc)
en rieles 5.2fuente
Sólo inténtalo:
fuente
Encuentro que esta consulta es mejor / más rápida para usar el método "pluck", que me encanta:
Esto le da un ActiveRecord como salida; para que pueda usar .pluck de esta manera:
que proporciona rápidamente los identificadores como una matriz mientras se utiliza un código SQL óptimo.
fuente
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:
o
fuente
Digamos N = 5 y su modelo es
Message
, puede hacer algo como esto:Mira el sql:
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.
fuente
Agregue un parámetro de orden a la consulta
fuente