ruby-on-rails - left - rails sql query




¿Cómo obtener los últimos N registros con activerecord? (9)

Para Rails 5 (y probablemente Rails 4)

Malo:

Something.last(5)

porque:

Something.last(5).class
=> Array

asi que:

Something.last(50000).count

probablemente hará explotar tu memoria o demorará para siempre.

Buen enfoque:

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 a través de .to_a . Asi que:

Something.limit(50000).order('id desc').count

... toma un segundo.

Con :limit en la consulta, obtendré los primeros N registros. ¿Cuál es la forma más fácil de obtener los últimos N registros?


Agregar un: parámetro de orden a la consulta


En mi proyecto de carriles (rails 4.2) , uso

Model.last(10) # get the last 10 record order by id

y funciona.


Encuentro que esta consulta es mejor / más rápida para usar el método "desplume", que me encanta:

Challenge.limit(5).order('id desc')

Esto da un ActiveRecord como salida; para que puedas usar .pluck en él así:

Challenge.limit(5).order('id desc').pluck(:id)

que rápidamente proporciona los identificadores como una matriz al usar un código SQL óptimo.


La nueva forma de hacerlo en rails 3.1 es SomeModel.limit(5).order('id desc')


La solución está aquí:

SomeModel.last(5).reverse

Como los rieles son flojos, eventualmente llegarán a la base de datos con SQL como: "SELECT table . * FROM table ORDER BY table . id DESC LIMIT 5".


Sólo inténtalo:

Model.all.order("id asc").limit(5)

Si necesita establecer algún orden en los resultados, use:

Model.order('name desc').limit(n) # n= number

si no necesita ningún pedido, y solo necesita registros guardados en la tabla, utilice:

Model.last(n) # n= any number

Una consulta de registro activa como esta creo que obtendrí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, de otra manera:

result = Something.find(:all, :order => "id desc", :limit => 5)

while !result.empty?
        puts result.pop
end




activerecord