Как получить последние N записей с activerecord?

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

Ответ 1

Такой активный запрос записи, как я думаю, даст вам то, что вы хотите ( "Что-то" - это имя модели):

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

edit. Как отмечено в комментариях, другой способ:

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

while !result.empty?
        puts result.pop
end

Ответ 2

Это путь Rails 3

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

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

Ответ 3

Новый способ сделать это в rails 3.1 является SomeModel.limit(5).order('id desc')

Ответ 4

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

SomeModel.last(5).reverse

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

Ответ 5

Для Rails 4 и выше версии:

Вы можете попробовать что-то вроде этого. Если вам нужна первая самая старая запись

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

Вы можете попробовать что-то вроде этого, если хотите последние последние записи.

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

Ответ 6

Для 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. Итак:

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

... занимает секунду.

Ответ 7

Если вам нужно установить некоторый порядок по результатам, используйте:

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

если вам не нужен какой-либо заказ, а просто нужны записи, сохраненные в таблице, используйте:

Model.last(n) # n= any number

Ответ 8

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

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

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

Ответ 9

Я считаю, что этот запрос лучше/быстрее для использования метода "pluck", который мне нравится:

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

В результате получается ActiveRecord; поэтому вы можете использовать .pluck на нем следующим образом:

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

который быстро дает идентификаторы в виде массива при использовании оптимального кода SQL.

Ответ 10

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

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

Ответ 11

Если у вас есть модель по умолчанию в вашей модели, которая указывает возрастающий порядок в Rails 3, вам нужно будет использовать порядок, а не порядок, указанный Артуром Невесом выше:

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

или

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

Ответ 12

Скажем, что 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

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

Ответ 13

Добавить параметр запроса в запрос