Jawaban:
Kueri rekaman aktif seperti ini menurut saya akan memberi Anda apa yang Anda inginkan ('Sesuatu' adalah nama model):
Something.find(:all, :order => "id desc", :limit => 5).reverse
sunting : Seperti disebutkan dalam komentar, dengan cara lain:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Ini adalah cara Rails 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
. Pendekatan yang benar adalah SomeModel.limit(5).order('id desc')
per Arthur Neves, yang menghasilkanSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
cara baru untuk melakukannya di rel 3.1 adalah SomeModel.limit(5).order('id desc')
last(5)
karena mengembalikan ruang lingkup untuk rantai lebih lanjut.
SomeModel.limit(100).reverse_order
Rails 4 ( guides.rubyonrails.org/... ) Sama saja.
SomeModel.limit(5).order('id desc').pluck(:col)
akan melakukan SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
yang jauh lebih efisien daripada meraih semua kolom dan membuang semua kecuali satu kolom SomeModel.last(5).map(&:col)
yang SELECT *
bukan digunakan SELECT col
(Anda tidak dapat memetik setelah memanggil terakhir; rantai lazy-eval berakhir dengan yang terakhir).
Something.last(5)
karena:
Something.last(5).class
=> Array
begitu:
Something.last(50000).count
kemungkinan akan meledakkan ingatan Anda atau mengambil selamanya.
Something.limit(5).order('id desc')
karena:
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"
Yang terakhir adalah ruang lingkup yang tidak dievaluasi. Anda dapat mengaitkannya, atau mengonversinya menjadi array melalui .to_a
. Begitu:
Something.limit(50000).order('id desc').count
... butuh sedetik.
Untuk versi Rails 4 dan di atasnya:
Anda dapat mencoba sesuatu seperti ini Jika Anda ingin entri tertua pertama
YourModel.order(id: :asc).limit(5).each do |d|
Anda dapat mencoba sesuatu seperti ini jika Anda ingin entri terbaru terakhir ..
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
karena sama denganYourModel.order()
Solusi ada di sini:
SomeModel.last(5).reverse
Karena rails malas, pada akhirnya akan mengenai database dengan SQL seperti: "SELECT table
. * FROM table
ORDER BY table
. id
DESC LIMIT 5".
SomeModel
SELECT
table .* FROM
table` ORDER BY table
. id
DESC LIMIT 5` itu tidak melakukan pilih semua
kita bisa menggunakan Model.last(5)
atau Model.limit(5).order(id: :desc)
di rel 5.2
Saya menemukan bahwa kueri ini lebih baik / lebih cepat untuk menggunakan metode "pencabut", yang saya sukai:
Challenge.limit(5).order('id desc')
Ini memberikan ActiveRecord sebagai output; jadi kamu bisa menggunakan .pluck di atasnya seperti ini:
Challenge.limit(5).order('id desc').pluck(:id)
yang dengan cepat memberikan id sebagai array saat menggunakan kode SQL yang optimal.
Challenge.limit(5).order('id desc').ids
akan bekerja dengan baik :)
Jika Anda memiliki cakupan default dalam model Anda yang menentukan urutan naik di Rails 3 Anda harus menggunakan memesan ulang daripada memesan seperti yang ditentukan oleh Arthur Neves di atas:
Something.limit(5).reorder('id desc')
atau
Something.reorder('id desc').limit(5)
Katakanlah N = 5 dan model Anda adalah Message
, Anda dapat melakukan sesuatu seperti ini:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Lihatlah sql:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
Kuncinya adalah subselect. Pertama kita perlu mendefinisikan apa pesan terakhir yang kita inginkan dan kemudian kita harus memesannya dalam urutan menaik.
Tambahkan parameter pesanan: ke kueri