С :limit
в запросе я получу первые N записей. Каков самый простой способ получить последние N записей?
Такой активный запрос записи, как я думаю, даст вам то, что вы хотите ( "Что-то" - это имя модели):
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
Это путь Rails 3
SomeModel.last(5) # last 5 records in ascending order
SomeModel.last(5).reverse # last 5 records in descending order
Новый способ сделать это в rails 3.1 является SomeModel.limit(5).order('id desc')
last(5)
потому что возвращает область для дальнейшего объединения в цепочку.
SomeModel.limit(100).reverse_order
в Rails 4 ( guides.rubyonrails.org/… ). Это то же самое.
Решение находится здесь:
SomeModel.last(5).reverse
Поскольку rails ленив, он, в конце концов, попадет в базу данных с SQL: "SELECT table
. * FROM table
ORDER BY table
. id
DESC LIMIT 5".
SomeModel
Для 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)
" "
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 (rails 4.2)
я использую
Model.last(10) # get the last 10 record order by id
и он работает.
Если вам нужно установить некоторый порядок по результатам, используйте:
Model.order('name desc').limit(n) # n= number
если вам не нужен какой-либо заказ, а просто нужны записи, сохраненные в таблице, используйте:
Model.last(n) # n= any number
Просто попробуйте:
Model.all.order("id asc").limit(5)
Я считаю, что этот запрос лучше/быстрее для использования метода "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
будет работать так же :)
Скажем, что 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
Ключ - это подзапрос. Сначала нам нужно определить, какие последние сообщения мы хотим, а затем мы должны упорядочить их в порядке возрастания.
Если у вас есть модель по умолчанию в вашей модели, которая указывает возрастающий порядок в Rails 3, вам нужно будет использовать порядок, а не порядок, указанный Артуром Невесом выше:
Something.limit(5).reorder('id desc')
или
Something.reorder('id desc').limit(5)
Добавить параметр запроса в запрос