Dengan :limit
in query, saya akan mendapatkan N record pertama. Apa cara termudah untuk mendapatkan catatan N terakhir?
163
Dengan :limit
in query, saya akan mendapatkan N record pertama. Apa cara termudah untuk mendapatkan catatan N terakhir?
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
sumber
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
==Array
. Pendekatan yang benar adalahSomeModel.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')
sumber
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 melakukanSELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
yang jauh lebih efisien daripada meraih semua kolom dan membuang semua kecuali satu kolomSomeModel.last(5).map(&:col)
yangSELECT *
bukan digunakanSELECT col
(Anda tidak dapat memetik setelah memanggil terakhir; rantai lazy-eval berakhir dengan yang terakhir).Untuk Rails 5 (dan kemungkinan Rails 4)
Buruk:
karena:
begitu:
kemungkinan akan meledakkan ingatan Anda atau mengambil selamanya.
Pendekatan yang baik:
karena:
Yang terakhir adalah ruang lingkup yang tidak dievaluasi. Anda dapat mengaitkannya, atau mengonversinya menjadi array melalui
.to_a
. Begitu:... butuh sedetik.
sumber
Untuk versi Rails 4 dan di atasnya:
Anda dapat mencoba sesuatu seperti ini Jika Anda ingin entri tertua pertama
Anda dapat mencoba sesuatu seperti ini jika Anda ingin entri terbaru terakhir ..
sumber
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
karena sama denganYourModel.order()
Solusi ada di sini:
Karena rails malas, pada akhirnya akan mengenai database dengan SQL seperti: "SELECT
table
. * FROMtable
ORDER BYtable
.id
DESC LIMIT 5".sumber
SomeModel
SELECT
table.* FROM
table` ORDER BYtable
.id
DESC LIMIT 5` itu tidak melakukan pilih semuaJika Anda perlu mengatur pemesanan pada hasil kemudian gunakan:
jika Anda tidak memerlukan pemesanan apa pun, dan hanya perlu catatan disimpan di tabel kemudian gunakan:
sumber
Dalam
(rails 4.2)
proyek rel saya , saya gunakandan itu berhasil.
sumber
kita bisa menggunakan
Model.last(5)
atauModel.limit(5).order(id: :desc)
di rel 5.2sumber
Coba saja:
sumber
Saya menemukan bahwa kueri ini lebih baik / lebih cepat untuk menggunakan metode "pencabut", yang saya sukai:
Ini memberikan ActiveRecord sebagai output; jadi kamu bisa menggunakan .pluck di atasnya seperti ini:
yang dengan cepat memberikan id sebagai array saat menggunakan kode SQL yang optimal.
sumber
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:
atau
sumber
Katakanlah N = 5 dan model Anda adalah
Message
, Anda dapat melakukan sesuatu seperti ini:Lihatlah sql:
Kuncinya adalah subselect. Pertama kita perlu mendefinisikan apa pesan terakhir yang kita inginkan dan kemudian kita harus memesannya dalam urutan menaik.
sumber
Tambahkan parameter pesanan: ke kueri
sumber