উত্তর:
এই জাতীয় একটি সক্রিয় রেকর্ড ক্যোয়ারী আমার মনে হয় আপনি যা চান তা পেয়ে যাবেন ('কিছু কিছু' মডেলের নাম):
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
= ails+ এর জন্য ভুল, কারণ == 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(5).order('id desc').pluck(:col)
করবে SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
যা সমস্ত কলামগুলি ধরার এবং একটি কলাম বাদ দেওয়ার পরিবর্তে আরও কার্যকর SomeModel.last(5).map(&:col)
যা করতে 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
OR table
অর্ডার থেকে table
। ডেস্ক id
লিমিটেড ৫"।
SomeModel
SELECT
টেবিল .* FROM
টেবিল` অর্ডার দ্বারা table
। id
আমরা 5.2 রেল Model.last(5)
বা ব্যবহার করতে পারিModel.limit(5).order(id: :desc)
আমি দেখতে পেয়েছি যে "প্লাক" পদ্ধতি ব্যবহার করার জন্য এই কোয়েরিটি আরও ভাল / দ্রুততর, যা আমি পছন্দ করি:
Challenge.limit(5).order('id desc')
এটি আউটপুট হিসাবে একটি অ্যাক্টিভেকর্ড দেয়; যাতে আপনি এটির মতো এটি ব্যবহার করতে পারেন:
Challenge.limit(5).order('id desc').pluck(:id)
যা সর্বোত্তম এসকিউএল কোড ব্যবহার করার সময় আইডিকে দ্রুত একটি অ্যারে হিসাবে দেয়।
Challenge.limit(5).order('id desc').ids
ঠিক তেমনি কাজ করবে :)
আপনার মডেলটিতে যদি আপনার একটি ডিফল্ট সুযোগ থাকে যা রেল 3 এ একটি আরোহণের আদেশ নির্দিষ্ট করে দেয় তবে আপনাকে আর্থার নেভস দ্বারা উল্লিখিত আদেশের পরিবর্তে পুনরায় অর্ডার ব্যবহার করতে হবে:
Something.limit(5).reorder('id desc')
অথবা
Something.reorder('id desc').limit(5)
ধরা যাক এন = 5 এবং আপনার মডেলটি হ'ল Message
আপনি এর মতো কিছু করতে পারেন:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
বর্গক্ষেত্র দেখুন:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
চাবিটি হ'ল সাবলেট। প্রথমে আমাদের শেষ বার্তাগুলি কী কী তা নির্ধারণ করতে হবে এবং তারপরে আমাদের সেগুলি আরোহী ক্রমে অর্ডার করতে হবে।
একটি যুক্ত করুন: ক্যোয়ারীতে অর্ডার পরামিতি