রিলে অন রুবি: অ্যাক্টিভেকর্ড ব্যবহার করে আমি দুটি কলামের সাথে কীভাবে বাছাই করব?


94

আমি দুটি কলাম অনুসারে বাছাই করতে চাই, একটি হ'ল তারিখটাইম ( updated_at) এবং অন্যটি দশমিক (মূল্য)

আমি আপডেটড্যাট দ্বারা প্রথমে বাছাই করতে সক্ষম হতে চাই, তারপরে, যদি একই দিনে একাধিক আইটেমগুলি ঘটে থাকে তবে দাম অনুসারে বাছাই করুন।

উত্তর:


66

ধরে নিই যে আপনি মাইএসকিউএল ব্যবহার করছেন,

Model.all(:order => 'DATE(updated_at), price')

অন্যান্য উত্তর থেকে পার্থক্য নোট করুন। updated_atকলামটি একটি পূর্ণ টাইমস্ট্যাম্প হতে হবে, তাই আপনি যদি সাজানোর উপর ভিত্তি করে করতে চান দিন এটা আপডেট করা হয়েছে, আপনি একটি ফাংশন ব্যবহার করতে টাইমস্ট্যাম্প থেকে মাত্র তারিখ অংশ পেতে হবে। মাইএসকিউএল এ, এটি DATE()


7
"অস্পষ্ট কলাম" বার্তাগুলি দিয়ে এলোমেলোভাবে বিরতিতে যোগ দেওয়া বন্ধ করতে আপনার নীচের আরও দৃ version় সংস্করণটি ব্যবহার করা উচিত: :order => ["DATE(#{table_name}.updated_at)", :price]( :priceএটি একটি প্রতীক হিসাবে উল্লেখ করুন))
জো লিস

আমার অর্ডার কলামটি এর orderমতো আমাকে Model.all(:order => "day asc, `order` asc")
মঞ্জুরি দিন


57
Thing.find(:all, :order => "updated_at desc, price asc")

কৌতুক করবে

হালনাগাদ:

Thing.all.order("updated_at DESC, price ASC")

রেলগুলি হল 3 উপায়। (ধন্যবাদ @cpursley )


4
আপনাকে ধন্যবাদ @ এরিক - আমি জানি এই উত্তরটি পুরানো তাই এখন এটি দেখার জন্য আমার সতর্কতা এখানে রয়েছে: এই পদ্ধতিটি রেল ৩.২ শুরু করে অবচিত করা হয়েছে। পরিবর্তে থিং.এল ব্যবহার করুন =)
আবদো

সঠিক, এটি আমার পক্ষে ভাল কাজ করেছে: Thing.all.order("updated_at DESC, price ASC")
সিপর্সলে

4
যখন আমার বাছাই করা মানগুলি ছোট করার প্রয়োজন ছিল তখন আপনার আপডেটটি আমার পক্ষে সহায়ক Thing.order("LOWER(name), number")
নিক

36

অ্যাক্টিভ রেকর্ড ক্যোয়ারী ইন্টারফেস আপনাকে আপনার ক্যোয়ারীটি অর্ডার করতে চান এমন অনেকগুলি বৈশিষ্ট্য নির্দিষ্ট করতে দেয় :

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তাই একজন ব্যক্তির জানতে চাই এটি বহুবচনে হচ্ছে। শুধু একটি পরামর্শ।
তাস

4
আমার মনে হয় আরও একটি বিশেষ উদাহরণ সম্পাদনা করা উচিত: উদাহরণস্বরূপ মডেল = মডেল.অর্ডার ({মূল্য:: ডেস্ক}, {তারিখ:: ডেস্ক}, {মূল্য: asc})
zw963

যদি কেউ এটি আটকে দেয় এবং সংজ্ঞায়িত পদ্ধতি ত্রুটি দেখে তবে এখানে একটি ছোট টাইপ রয়েছে। এটি এর :ascপরিবর্তে হওয়া উচিত asc:Model.order({price: :desc}, {date: :desc}, {price: :asc})
নয়আওয়াই

18

অ্যাক্টিভ রেকর্ড ব্যবহার করে এটি করার অনেক উপায় রয়েছে। উপরে উল্লেখ করা হয়নি এমন একটি হ'ল (বিভিন্ন ফর্ম্যাটে, সমস্ত বৈধ):

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)

আপনাকে ডেটা প্রকারের ঘোষণা করার দরকার নেই, অ্যাক্টিভেকর্ড এটি স্বাচ্ছন্দ্যে করে এবং আপনার ডিবি ইঞ্জিনও তাই করে


দুটি পৃথক টেবিলের মতো দুটি সদস্য কলাম ব্যবহার করার সময় এটি দুর্দান্ত কাজ করে: মেম্বার.কমডিউডস (: ভোটার)। অর্ডার ("টাউন_ক্লাব এসএসসি")। অর্ডার ("Voters.last_name asc")
বেকুনজি01

4
আপনার পোস্ট করা এসকিউএল এর সাথে কি মিল রয়েছে Model.order(foo: :asc).order(:bar => :desc).order(:etc)? এসকিউএল-এ অর্ডার ধারাগুলির ক্রম যখন আমি এটি চালিত করি তখন তার বিপরীত .to_sql
কাজাজ

4
@ কাজ এটি অনেক দিন আগে। আমি মনে করি আমার সম্ভবত এটির সংশোধন করা দরকার, আমি কখনই লক্ষ্য করিনি। আমি পরে ডাবল চেক করব। ধন্যবাদ
রুবি রেসার 18


0

এগুলির কোনোটাই আমার পক্ষে কাজ করেনি! ঠিক 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.