Yanıtlar:
Bunun gibi aktif bir kayıt sorgusu size ne istediğini alırsınız ('Bir şey' model adıdır):
Something.find(:all, :order => "id desc", :limit => 5).reverse
edit : Yorumlarda belirtildiği gibi, başka bir yol:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Bu Rails 3 yoludur
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
== nedeniyle Rails 4+ için yanlıştır Array
. Doğru yaklaşım SomeModel.limit(5).order('id desc')
Arthur Neves'e göre, sonuç:SELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
raylar 3.1 bunu yapmanın yeni yolu SomeModel.limit(5).order('id desc')
last(5)
zincirleme için bir kapsam döndürdüğü için daha iyidir .
SomeModel.limit(100).reverse_order
Raylar 4 (üzerinde guides.rubyonrails.org/... de aynı durum geçerlidir).
SomeModel.limit(5).order('id desc').pluck(:col)
yapacağız SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
çok daha verimli tüm sütunları kapma ve tüm ama bir sütun ile atmadan daha hangi SomeModel.last(5).map(&:col)
bağlantıda bulunduğu SELECT *
yerine SELECT col
(aradığınız olamaz koparmak sonra son; tembel-değerlendirme zinciri son ile biter).
Something.last(5)
Çünkü:
Something.last(5).class
=> Array
yani:
Something.last(50000).count
muhtemelen hafızanızı havaya uçuracak veya sonsuza kadar sürecektir.
Something.limit(5).order('id desc')
Çünkü:
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"
İkincisi değerlendirilmemiş bir kapsamdır. Zincir oluşturabilir veya bir diziye dönüştürebilirsiniz .to_a
. Yani:
Something.limit(50000).order('id desc').count
... bir saniye sürüyor.
İçin Raylar 4 ve sürüm yukarıdaki:
İlk en eski girişi istiyorsanız böyle bir şey deneyebilirsiniz
YourModel.order(id: :asc).limit(5).each do |d|
En son girişleri istiyorsanız böyle bir şey deneyebilirsiniz ..
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
çünkü aynıYourModel.order()
Çözüm burada:
SomeModel.last(5).reverse
Raylar tembel olduğu için, sonunda veritabanına SQL gibi vuracaktır: "SELECT table
. * table
SİPARİŞ TARAFINDAN table
. id
DESC LIMIT 5".
SomeModel
SELECT
table .* FROM
table` ORDER BY table
. id
AZALAN SINIR 5` o mu değil bir bütün seçmek gerçekleştirmek
kullanabilir Model.last(5)
veya Model.limit(5).order(id: :desc)
raylar halinde 5.2
Bu sorguyu daha iyi / daha hızlı seviyorum "pluck" yöntemi kullanmak için bulmak:
Challenge.limit(5).order('id desc')
Bu çıktı olarak bir ActiveRecord verir; böylece .pluck komutunu şu şekilde kullanabilirsiniz:
Challenge.limit(5).order('id desc').pluck(:id)
optimal SQL kodunu kullanırken kimlikleri hızlı bir şekilde dizi olarak verir.
Challenge.limit(5).order('id desc').ids
de işe yarayacak :)
Modelinizde Rails 3'te artan bir sipariş belirten varsayılan bir kapsamınız varsa, yukarıdaki Arthur Neves tarafından belirtildiği gibi sipariş yerine yeniden sipariş vermeniz gerekir:
Something.limit(5).reorder('id desc')
veya
Something.reorder('id desc').limit(5)
Diyelim ki N = 5 ve modeliniz şu Message
şekilde bir şey yapabilirsiniz:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Sql bak:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
Anahtar alt seçenektir. Öncelikle istediğimiz son mesajların ne olduğunu tanımlamamız ve sonra bunları artan sırada sipariş etmemiz gerekiyor.
Sorguya bir: sipariş parametresi ekleme