जवाबों:
इस तरह से एक सक्रिय रिकॉर्ड क्वेरी मुझे लगता है कि आपको वह मिलेगा जो आप चाहते हैं ('कुछ' मॉडल का नाम है):
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
== के बाद से रेल 4+ के लिए गलत है 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
रेल्स 4 पर प्रयोग करता हूं ( guide.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)
जिसके साथ आप कॉल करने के बाद प्लक नहीं कर सकते हैं अंतिम; आलसी-eval श्रृंखला अंतिम के साथ समाप्त होती है)। 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
चूंकि रेल आलसी है, इसलिए यह अंततः एसक्यूएल के साथ डेटाबेस को हिट करेगा जैसे: "का चयन करें table
। * ओर से । table
द्वारा जारी करें table
। id
DESC LIMIT 5"।
SomeModel
SELECT
तालिका तालिका .* FROM
`आदेश द्वारा table
। id
DESC LIMIT में 5` यह है नहीं एक सभी का चयन प्रदर्शन
हम 5.2 Model.last(5)
या Model.limit(5).order(id: :desc)
रेल में उपयोग कर सकते हैं
मुझे लगता है कि "प्लक" विधि का उपयोग करने के लिए यह क्वेरी बेहतर / तेज़ है, जो मुझे पसंद है:
Challenge.limit(5).order('id desc')
यह आउटपुट के रूप में एक ActiveRecord देता है; तो आप इस तरह से .pluck का उपयोग कर सकते हैं:
Challenge.limit(5).order('id desc').pluck(:id)
जो इष्टतम SQL कोड का उपयोग करते हुए जल्दी से आईडी को एक सरणी के रूप में देता है।
Challenge.limit(5).order('id desc').ids
के रूप में अच्छी तरह से काम करेंगे :)
यदि आपके पास अपने मॉडल में एक डिफ़ॉल्ट स्कोप है जो रेल 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
कुंजी उपशम है। पहले हमें यह परिभाषित करने की आवश्यकता है कि हम कौन से अंतिम संदेश चाहते हैं और फिर हमें उन्हें आरोही क्रम में लाना होगा।
क्वेरी में a: ऑर्डर पैरामीटर जोड़ें