मैं दो कॉलमों को क्रमबद्ध करना चाहता हूं, एक डेटटाइम ( updated_at) है, और दूसरा एक दशमलव (मूल्य) है
मैं अपडेटेड_एट द्वारा पहले सॉर्ट करने में सक्षम होना चाहूंगा, फिर, यदि एक ही दिन में कई आइटम होते हैं, तो मूल्य के आधार पर सॉर्ट करें।
मैं दो कॉलमों को क्रमबद्ध करना चाहता हूं, एक डेटटाइम ( updated_at) है, और दूसरा एक दशमलव (मूल्य) है
मैं अपडेटेड_एट द्वारा पहले सॉर्ट करने में सक्षम होना चाहूंगा, फिर, यदि एक ही दिन में कई आइटम होते हैं, तो मूल्य के आधार पर सॉर्ट करें।
जवाबों:
मान लें कि आप MySQL का उपयोग कर रहे हैं,
Model.all(:order => 'DATE(updated_at), price')
अन्य उत्तरों से भेद पर ध्यान दें। updated_atस्तंभ एक पूर्ण टाइमस्टैम्प हो जाएगा, इसलिए यदि आप प्रकार के आधार पर करना चाहते हैं दिन यह अद्यतन किया गया था, तो आप एक समारोह का उपयोग करने के टाइमस्टैम्प से सिर्फ तारीख हिस्सा पाने के लिए की जरूरत है। MySQL में, वह है DATE()।
orderतरह से बचाना था:Model.all(:order => "day asc, `order` asc")
रेल 4 में आप कुछ ऐसा कर सकते हैं:
Model.order(foo: :asc, bar: :desc)
fooऔर bardb में कॉलम हैं।
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)
शायद यह अधिक क्रिया है, लेकिन व्यक्तिगत रूप से मुझे इसे प्रबंधित करना आसान लगता है। SQL केवल एक चरण में निर्मित होता है:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
इस प्रकार, मूल प्रश्न के लिए:
Model.order(:updated_at).order(:price)
आपको डेटा प्रकार की घोषणा करने की आवश्यकता नहीं है, ActiveRecord यह सुचारू रूप से करता है, और इसी तरह आपका DB इंजन
Model.order(foo: :asc).order(:bar => :desc).order(:etc)? एसक्यूएल में ऑर्डर क्लॉज का क्रम .to_sqlउस पर चलने के दौरान मुझे जो मिलता है उसके विपरीत है।
इनमें से किसी ने भी मेरे लिए काम नहीं किया! इंटरनेट पर ऊपर और नीचे देखने के ठीक 2 दिनों के बाद, मुझे एक समाधान मिला !!
मान लें कि आपके पास उत्पाद तालिका में कई कॉलम हैं: special_price और msrp। ये दो स्तंभ हैं जिन्हें हम क्रमबद्ध कर रहे हैं।
ठीक है, पहले अपने मॉडल में इस पंक्ति को जोड़ें:
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एक प्रतीक है।)