কীভাবে অ্যাক্টিভেকর্ডের সাথে সর্বশেষ এন রেকর্ডস পাবেন?


163

সঙ্গে :limitক্যোয়ারীতে, আমি প্রথম এন রেকর্ড পাবেন। সর্বশেষ এন রেকর্ডগুলি পাওয়ার সহজতম উপায় কী?

উত্তর:


143

এই জাতীয় একটি সক্রিয় রেকর্ড ক্যোয়ারী আমার মনে হয় আপনি যা চান তা পেয়ে যাবেন ('কিছু কিছু' মডেলের নাম):

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

দুবার ডেটা অর্ডার করতে অপ্রয়োজনীয় বলে মনে হচ্ছে, আমি বর্তমানে প্রথমে গণনা পাচ্ছি এবং এটি অফসেট দিয়ে ব্যবহার করছি
জেটআর

এটি অন্য পদ্ধতিটি সম্পর্কে আমি ভাবছিলাম, তবে এটি আরও কাজ বলে মনে হচ্ছে যেহেতু এটি 1 টির পরিবর্তে ডাটাবেসের বিরুদ্ধে 2 টি ক্যোয়ারী gu আমার ধারণা আমি ধারণা করি যে আপনাকে কোনও বিন্যাসে অ্যারেটি পুনরাবৃত্তি করতে হবে, সুতরাং আপনি রুবি সাজানোর সুযোগ দিতে পারেন এটি এই সময়ে। (যেমন। রেকর্ডস.রেভার.এচ কর ..)
ড্যান ম্যাকনেভিন

পর্যায়ক্রমে, আপনি অ্যারেটি বিপরীত না করে অ্যারে থেকে পুনরাবৃত্তি করতে অ্যারে.পপ ব্যবহার করতে পারবেন না .. রুবি
ড্যান ম্যাকনেভিন

1
রেল 3 এর জন্য, পরিবর্তে বোংসের জবাব দেখুন। এই উপায়টি এখনও কাজ করে তবে এটি আর পছন্দসই উপায় নয়।
কাইল হিরোনিমাস

3
# ফাইন্ড (: সমস্ত) কল করা অবহেলা করা হয়েছে। পরিবর্তে সরাসরি # কল করুন।
স্নো ক্র্যাশ

262

এটি রেলগুলি 3 উপায়

SomeModel.last(5) # last 5 records in ascending order

SomeModel.last(5).reverse # last 5 records in descending order

4
পোস্টগ্রিস দিয়ে এটি ব্যবহার করে দেখুন! আমি অবশ্যই প্রথম সমস্যা ছিল। এসকিউএল-তে অর্ডারটির গ্যারান্টি নেই তবে আপনি এটি নির্দিষ্ট না করলেও মাইএসকিউএল আরও ক্ষমাশীল iving
ঘোটি

5
দ্রষ্টব্য: এটি কার্যকর করার পক্ষে এটি ভাল পদ্ধতি নয়, পারফরম্যান্স অনুযায়ী - কমপক্ষে ৩.১ রেল পর্যন্ত না। সামমোডেল.লাস্ট (৫) কোনও সীমা ছাড়াই নির্বাচিত বিবৃতিটি কার্যকর করবে, সামার মডেলের সমস্ত রেকর্ডকে রুবিকে অ্যারে হিসাবে ফিরিয়ে দেবে, তার পরে রুবি শেষ (5) উপাদান বেছে নেবে। দক্ষতা অনুসারে, বর্তমানে, আপনি সীমাটি ব্যবহার করতে চান - বিশেষত যদি আপনার সম্ভাব্য অনেক উপাদান থাকে।
ড্রবিনসন

14
ঠিক চাপলে কি হবে এটি করা উচিত:SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
firedev

7
4 রেলগুলিতে .last () দ্বারা উত্পাদিত ক্যোয়ারী নিকের উল্লেখ অনুসারে সর্বোত্তম
জিমি টাইরেল

1
এটি SomeModel.last(5).class= ails+ এর জন্য ভুল, কারণ == Array। সঠিক পদ্ধতিটি SomeModel.limit(5).order('id desc')আর্থার নেভস অনুযায়ী, যার ফলস্বরূপSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
আমিন আরিয়ানা

50

রেলগুলিতে এটি করার নতুন উপায় হ'ল 3.1 SomeModel.limit(5).order('id desc')


14
এটি last(5)আরও চেইন করার সুযোগ দেয় কারণ এটি আরও ভাল।
লুলালালা

3
আমি SomeModel.limit(100).reverse_order4 রেলগুলিতে ব্যবহার করি ( গাইড.রুবিওনরইলস.আর। ) এটি একই।
ইভান ব্ল্যাক

@ লুলালালার দ্বারা উল্লিখিত "আরও শৃঙ্খলার জন্য সুযোগ" এর উদাহরণ: আপনার যদি কেবল একটি কলামের প্রয়োজন হয় তবে এটি 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(কল করার পরে আপনি টানতে পারবেন না) শেষ; অলস-ইভাল শৃঙ্খলা শেষের সাথে শেষ হয়)।
কানাত বোলাজার

33

5 কারাগারের জন্য (এবং সম্ভবত 4 টি)

খারাপ:

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

... এক সেকেন্ড সময় লাগে।


1
এমনকি 3 টিও, আসলে ails ;)
জোশুয়া পিন্টার

32

জন্য পাগল 4 এবং সংস্করণের থেকে উচ্চতর:

আপনি যদি প্রথমতম এন্ট্রি চান তবে আপনি এর মতো কিছু চেষ্টা করতে পারেন

YourModel.order(id: :asc).limit(5).each do |d|

আপনি সর্বশেষতম এন্ট্রিগুলি চাইলে আপনি এরকম কিছু চেষ্টা করতে পারেন ..

YourModel.order(id: :desc).limit(5).each do |d|

1
এটি গ্রহণযোগ্য উত্তরের চেয়ে 4 টি রেলের জন্য আপ টু ডেট উত্তর বলে মনে হচ্ছে। আমি মনে করি যে সর্বাধিক সাম্প্রতিক সিনট্যাক্সটি দেখতে এইরকম হওয়া উচিত:YourModel.all.order(id: :desc).limit(5)
jmarceli

@ ব্যবহারকারী2041318: এই নতুন সিনট্যাক্সের জন্য ধন্যবাদ" "
গাগান গামি

2
অর্ডার () সমস্ত রেকর্ড ফিরিয়ে দেয়। সেখানে চেইন কোন প্রয়োজন নেই YourModel.all.order()কারণ হিসাবে একইYourModel.order()
ফ্রান্সিসকো Quintero

26

সমাধান এখানে:

SomeModel.last(5).reverse

যেহেতু রেলগুলি অলস, এটি শেষ পর্যন্ত এসকিউএল এর সাথে ডাটাবেসে হিট করবে যেমন: "নির্বাচন করুন tableOR table অর্ডার থেকে table। ডেস্ক idলিমিটেড ৫"।


এটি সমস্ত রেকর্ড লোড করবেSomeModel
জন হিনেগান

একটি ভাল পদ্ধতির সীমাবদ্ধ করা (); এটি দক্ষ দেখাচ্ছে না।
অনুরাগ

3
@ ডেভেলপার একেবারে ঠিক। কার্যকর করা এসকিউএলটি হ'ল: SELECT টেবিল .* FROM টেবিল` অর্ডার দ্বারা tableid
ডিইএসসি লিমিটেড 5`

4

যদি আপনাকে ফলাফলগুলি সম্পর্কে কিছু ক্রম সেট করতে হয় তবে ব্যবহার করুন:

Model.order('name desc').limit(n) # n= number

যদি আপনার কোনও অর্ডিংয়ের প্রয়োজন না হয় এবং কেবল সারণীতে সংরক্ষণ করা রেকর্ডের প্রয়োজন হয় তবে ব্যবহার করুন:

Model.last(n) # n= any number

4

আমার রেল (rails 4.2)প্রকল্পে, আমি ব্যবহার করি

Model.last(10) # get the last 10 record order by id

এবং এটি কাজ করে।



2

ঠিক করার চেষ্টা করুন:

Model.order("field_for_sort desc").limit(5)

2
আপনার সমাধান করা উচিত কেন এই সমাধানটি কার্যকর is
পিটার

1

আমি দেখতে পেয়েছি যে "প্লাক" পদ্ধতি ব্যবহার করার জন্য এই কোয়েরিটি আরও ভাল / দ্রুততর, যা আমি পছন্দ করি:

Challenge.limit(5).order('id desc')

এটি আউটপুট হিসাবে একটি অ্যাক্টিভেকর্ড দেয়; যাতে আপনি এটির মতো এটি ব্যবহার করতে পারেন:

Challenge.limit(5).order('id desc').pluck(:id)

যা সর্বোত্তম এসকিউএল কোড ব্যবহার করার সময় আইডিকে দ্রুত একটি অ্যারে হিসাবে দেয়।


Challenge.limit(5).order('id desc').idsঠিক তেমনি কাজ করবে :)
কোয়েন।

0

আপনার মডেলটিতে যদি আপনার একটি ডিফল্ট সুযোগ থাকে যা রেল 3 এ একটি আরোহণের আদেশ নির্দিষ্ট করে দেয় তবে আপনাকে আর্থার নেভস দ্বারা উল্লিখিত আদেশের পরিবর্তে পুনরায় অর্ডার ব্যবহার করতে হবে:

Something.limit(5).reorder('id desc')

অথবা

Something.reorder('id desc').limit(5)

0

ধরা যাক এন = 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

চাবিটি হ'ল সাবলেট। প্রথমে আমাদের শেষ বার্তাগুলি কী কী তা নির্ধারণ করতে হবে এবং তারপরে আমাদের সেগুলি আরোহী ক্রমে অর্ডার করতে হবে।


-4

একটি যুক্ত করুন: ক্যোয়ারীতে অর্ডার পরামিতি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.