¿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?
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
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
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')
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".
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|
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.
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
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.
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.
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)
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)
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.
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
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