Відповіді:
Такий активний запит запису, як я думаю, отримав би те, що ви хочете ("Щось" - назва моделі):
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
... займає секунду.
Для версії 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
Оскільки рейки ледачі, вони з часом потрапляють у базу даних із SQL на зразок: "SELECT table
. * OF 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
Я вважаю, що цей запит краще / швидше для використання методу "pluck", який мені подобається:
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