Ответы:
Такой запрос активной записи, как я думаю, даст вам то, что вы хотите («Something» - название модели):
Something.find(:all, :order => "id desc", :limit => 5).reverse
редактировать : как отмечено в комментариях, другой способ:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Это рельсы 3 пути
SomeModel.last(5) # last 5 records in ascending order
SomeModel.last(5).reverse # last 5 records in descending order
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
== Array
. Правильный подход в SomeModel.limit(5).order('id desc')
соответствии с Артуром Невесом, что приводит кSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
новый способ сделать это в рельсах 3.1 SomeModel.limit(5).order('id desc')
last(5)
потому, что он возвращает область для дальнейшего создания цепочки.
SomeModel.limit(100).reverse_order
на Rails 4 ( guides.rubyonrails.org/… ) Это то же самое.
SomeModel.limit(5).order('id desc').pluck(:col)
это SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
будет гораздо эффективнее, чем захват всех столбцов и отбрасывание всех столбцов, кроме одного, с SomeModel.last(5).map(&:col)
которым SELECT *
вместо SELECT col
(вы не можете извлечь после вызова последний; лениво-цепочка заканчивается на последнюю).
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
... занимает секунду.
Для Rails 4 и выше:
Вы можете попробовать что-то вроде этого, если вы хотите первую самую старую запись
YourModel.order(id: :asc).limit(5).each do |d|
Вы можете попробовать что-то вроде этого, если вы хотите последние последние записи ..
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
потому что это то же самое, чтоYourModel.order()
Решение здесь:
SomeModel.last(5).reverse
Поскольку rails является ленивым, он в конечном итоге попадет в базу данных с помощью SQL, например: «SELECT table
. * FROM table
ORDER BY table
. id
DESC LIMIT 5».
SomeModel
SELECT
таблица таблицы .* FROM
ORDER BY table
. id
DESC LIMIT 5` не выполняет выделение всех
мы можем использовать Model.last(5)
или Model.limit(5).order(id: :desc)
в рельсах 5.2
Я считаю, что этот запрос лучше / быстрее для использования метода «срывать», который я люблю:
Challenge.limit(5).order('id desc')
Это дает ActiveRecord в качестве вывода; так что вы можете использовать .pluck на нем так:
Challenge.limit(5).order('id desc').pluck(:id)
который быстро дает идентификаторы в виде массива при использовании оптимального кода SQL.
Challenge.limit(5).order('id desc').ids
будет работать так же хорошо :)
Если у вас есть область по умолчанию в вашей модели, которая задает восходящий порядок в Rails 3, вам нужно будет использовать переупорядочение, а не порядок, как указано Артуром Невесом выше:
Something.limit(5).reorder('id desc')
или
Something.reorder('id desc').limit(5)
Допустим, 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
Ключ - это отбор. Сначала нам нужно определить, какие последние сообщения мы хотим, а затем мы должны упорядочить их в порядке возрастания.
Добавьте параметр: order в запрос