আমি দুটি কলাম অনুসারে বাছাই করতে চাই, একটি হ'ল তারিখটাইম ( updated_at) এবং অন্যটি দশমিক (মূল্য)
আমি আপডেটড্যাট দ্বারা প্রথমে বাছাই করতে সক্ষম হতে চাই, তারপরে, যদি একই দিনে একাধিক আইটেমগুলি ঘটে থাকে তবে দাম অনুসারে বাছাই করুন।
আমি দুটি কলাম অনুসারে বাছাই করতে চাই, একটি হ'ল তারিখটাইম ( updated_at) এবং অন্যটি দশমিক (মূল্য)
আমি আপডেটড্যাট দ্বারা প্রথমে বাছাই করতে সক্ষম হতে চাই, তারপরে, যদি একই দিনে একাধিক আইটেমগুলি ঘটে থাকে তবে দাম অনুসারে বাছাই করুন।
উত্তর:
ধরে নিই যে আপনি মাইএসকিউএল ব্যবহার করছেন,
Model.all(:order => 'DATE(updated_at), price')
অন্যান্য উত্তর থেকে পার্থক্য নোট করুন। updated_atকলামটি একটি পূর্ণ টাইমস্ট্যাম্প হতে হবে, তাই আপনি যদি সাজানোর উপর ভিত্তি করে করতে চান দিন এটা আপডেট করা হয়েছে, আপনি একটি ফাংশন ব্যবহার করতে টাইমস্ট্যাম্প থেকে মাত্র তারিখ অংশ পেতে হবে। মাইএসকিউএল এ, এটি DATE()।
orderমতো আমাকে Model.all(:order => "day asc, `order` asc")
4 রেলগুলিতে আপনি এর মতো কিছু করতে পারেন:
Model.order(foo: :asc, bar: :desc)
fooএবং barডিবিতে কলাম রয়েছে।
Thing.find(:all, :order => "updated_at desc, price asc")
কৌতুক করবে
Thing.all.order("updated_at DESC, price ASC")
রেলগুলি হল 3 উপায়। (ধন্যবাদ @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")।
অ্যাক্টিভ রেকর্ড ক্যোয়ারী ইন্টারফেস আপনাকে আপনার ক্যোয়ারীটি অর্ডার করতে চান এমন অনেকগুলি বৈশিষ্ট্য নির্দিষ্ট করতে দেয় :
models = Model.order(:date, :hour, price: :desc)
অথবা আপনি যদি আরও নির্দিষ্ট পেতে চান (ধন্যবাদ @ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
বোনাস: প্রথম ক্যোয়ারির পরে, আপনি অন্যান্য প্রশ্নের চেইন করতে পারেন:
models = models.where('date >= :date', date: Time.current.to_date)
modelথেকে modelsতাই একজন ব্যক্তির জানতে চাই এটি বহুবচনে হচ্ছে। শুধু একটি পরামর্শ।
:ascপরিবর্তে হওয়া উচিত asc:Model.order({price: :desc}, {date: :desc}, {price: :asc})
অ্যাক্টিভ রেকর্ড ব্যবহার করে এটি করার অনেক উপায় রয়েছে। উপরে উল্লেখ করা হয়নি এমন একটি হ'ল (বিভিন্ন ফর্ম্যাটে, সমস্ত বৈধ):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
সম্ভবত এটি আরও ভার্বোজ, তবে ব্যক্তিগতভাবে আমি এটি পরিচালনা করা আরও সহজ মনে করি। এসকিউএল কেবলমাত্র এক ধাপে উত্পাদিত হয়:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
এইভাবে, মূল প্রশ্নের জন্য:
Model.order(:updated_at).order(:price)
আপনাকে ডেটা প্রকারের ঘোষণা করার দরকার নেই, অ্যাক্টিভেকর্ড এটি স্বাচ্ছন্দ্যে করে এবং আপনার ডিবি ইঞ্জিনও তাই করে
Model.order(foo: :asc).order(:bar => :desc).order(:etc)? এসকিউএল-এ অর্ডার ধারাগুলির ক্রম যখন আমি এটি চালিত করি তখন তার বিপরীত .to_sql।
এগুলির কোনোটাই আমার পক্ষে কাজ করেনি! ঠিক 2 দিন ইন্টারনেটে উপরে এবং নীচে তাকানোর পরে, আমি একটি সমাধান খুঁজে পেয়েছি !!
আসুন বলতে পারি যে পণ্যের টেবিলে আপনার অনেকগুলি কলাম রয়েছে যার মধ্যে রয়েছে: স্পেশাল_প্রিস এবং এমএসআরপি। এটি আমরা দুটি কলামের সাথে বাছাই করার চেষ্টা করছি।
ঠিক আছে, আপনার মডেলের প্রথমে এই লাইনটি যুক্ত করুন:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
দ্বিতীয়ত, প্রোডাক্ট কন্ট্রোলারে, যেখানে আপনাকে অনুসন্ধান সম্পাদন করতে হবে সেখানে যুক্ত করুন:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price](:priceএটি একটি প্রতীক হিসাবে উল্লেখ করুন))