[ruby-on-rails] ¿Cómo obtener los últimos N registros con activerecord?


Answers

Esta es la forma de Rails 3

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

SomeModel.last(5).reverse # last 5 records in descending order
Question

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?




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




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".




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.




En mi proyecto de carriles (rails 4.2) , uso

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

y funciona.




Sólo inténtalo:

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



Related