[Ruby-on-rails] Как получить последние N записей с activerecord?


Answers

Это путь Rails 3

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

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

С :limit в запросе, я получу первые N записей. Каков самый простой способ получить последние N записей?




Решение находится здесь:

SomeModel.last(5).reverse

Поскольку rails ленив, он в конечном итоге попадет в базу данных с SQL, например: «SELECT table . * FROM table ORDER BY. id DESC LIMIT 5».




В моем проекте rails (rails 4.2) я использую

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

и это работает.




Скажем, N = 5, а ваша модель - это Message , вы можете сделать что-то вроде этого:

Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)

Посмотрите на sql:

SELECT "messages".* FROM (
  SELECT  "messages".* FROM "messages"  ORDER BY "messages"."created_at" DESC LIMIT 5
) messages  ORDER BY "messages"."created_at" ASC

Ключ - это подзаголовок. Сначала нам нужно определить, каковы последние сообщения, которые мы хотим, а затем мы должны упорядочить их в порядке возрастания.




Просто попробуй:

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



Для Rails 5 (и, вероятно, Rails 4)

Плохо:

Something.last(5)

потому как:

Something.last(5).class
=> Array

так:

Something.last(50000).count

скорее всего, взорвут вашу память или возьмут навсегда.

Хороший подход:

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

потому как:

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"

Последнее - неоценимый объем. Вы можете .to_a его или преобразовать в массив через .to_a . Так:

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

... занимает второе место.