Как получить последние N записей с помощью activerecord? - PullRequest
153 голосов
/ 07 января 2009

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

Ответы [ 13 ]

252 голосов
/ 27 января 2012

Это Rails 3 way

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

SomeModel.last(5).reverse # last 5 records in descending order
139 голосов
/ 07 января 2009

Запрос на активную запись, подобный этому, я думаю, даст вам то, что вы хотите ('Something' - название модели):

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
50 голосов
/ 16 декабря 2011

новый способ сделать это в рельсах 3.1 - SomeModel.limit(5).order('id desc')

28 голосов
/ 09 июля 2014

Для Рельсы 4 и выше:

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

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

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

YourModel.order(id: :desc).limit(5).each do |d|
25 голосов
/ 08 сентября 2010

Решение здесь:

SomeModel.last(5).reverse

Поскольку rails является ленивым, он в конечном итоге попадет в базу данных с помощью SQL:

20 голосов
/ 26 июля 2017

Для 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

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

4 голосов
/ 10 июля 2016

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

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

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

4 голосов
/ 14 февраля 2015

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

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

если вам не нужно упорядочивать, а просто нужно сохранить записи в таблице, используйте:

Model.last(n) # n= any number
1 голос
/ 04 мая 2016

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

Model.all.order("id asc").limit(5)
1 голос
/ 21 января 2015

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

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

Это дает ActiveRecord в качестве вывода; так что вы можете использовать .pluck на нем так:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...