Con :limitin query, obtendré los primeros N registros. ¿Cuál es la forma más fácil de obtener los últimos N registros?
163
Con :limitin 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 50SomeModel.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 5nueva 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_orderen 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 5es 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. * DESDEtableORDENAR PORtable.idLÍMITE DESC 5".fuente
SomeModelSELECTtable.* FROMtable` ORDER BYtable.idDESC 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').idsfuncionará 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