С :limit
в запросе я получу первые N записей. Каков самый простой способ получить последние N записей?
Как получить последние N записей с activerecord?
Ответ 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
Добавить параметр запроса в запрос