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


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

Author: Arslan Ali, 2009-01-07

13 answers

Una consulta de active record como esta creo que te daría lo que quieres ('Algo' es el nombre del modelo):

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

Editar : Como se indica en los comentarios, de otra manera:

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

while !result.empty?
        puts result.pop
end
 135
Author: Dan McNevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-07 14:40:05

Este es el camino de los Rieles 3

SomeModel.last(5) # last 5 records in ascending order

SomeModel.last(5).reverse # last 5 records in descending order
 249
Author: Bongs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 18:48:52

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

 49
Author: Arthur Neves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 05:52:29

La solución está aquí:

SomeModel.last(5).reverse

Dado que rails es perezoso, eventualmente llegará a la base de datos con SQL como: "SELECT table.* FROM table ORDER BY table.id DESC LÍMITE 5".

 25
Author: Developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-09 21:07:10

Para Rails 4 y versiones superiores:

Puedes probar algo como esto Si quieres primera entrada más antigua

YourModel.order(id: :asc).limit(5).each do |d|

Puedes probar algo como esto si quieres últimas entradas..

YourModel.order(id: :desc).limit(5).each do |d|
 25
Author: Gagan Gami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-01 07:08:19

Para los carriles 5 (y probablemente Carriles 4)

Malo:

Something.last(5)

Porque:

Something.last(5).class
=> Array

Así que:

Something.last(50000).count

Probablemente explotará su memoria o tomará 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 ámbito no evaluado. Puede encadenarlo, o convertirlo en una matriz a través de .to_a. Así que:

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

... toma un segundo.

 14
Author: Amin Ariana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-26 18:44:15

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, use:

Model.last(n) # n= any number
 4
Author: Thorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-16 03:24:46

En mi proyecto rails (rails 4.2), utilizo

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

Y funciona.

 4
Author: timlentse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-10 13:46:20

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 da un ActiveRecord como salida; para que pueda usarlo .pégale así:

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

Que rápidamente da los ids como una matriz mientras se utiliza el código SQL óptimo.

 1
Author: Brandon Meredith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-21 19:29:57

Solo inténtalo:

Model.all.order("id asc").limit(5)
 1
Author: Thorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-04 15:54:59

Si tiene un ámbito predeterminado en su modelo que especifica un orden ascendente en Rails 3, necesitará usar reorden en lugar de orden como lo especificó Arthur Neves anteriormente:

Something.limit(5).reorder('id desc')

O

Something.reorder('id desc').limit(5)
 0
Author: scifisamurai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-18 17:18:50

Digamos que N = 5 y tu modelo es Message, puedes 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 tenemos que definir cuáles son los últimos mensajes que queremos y luego tenemos que ordenarlos en orden ascendente.

 0
Author: MatayoshiMariano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-22 00:22:00

Agregue un parámetro: order a la consulta

 -4
Author: frankodwyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-07 13:52:31