रूबी ऑन रेल्स: मैं ActiveRecord का उपयोग करके दो कॉलम के साथ कैसे सॉर्ट करूं?


91

मैं दो कॉलमों को क्रमबद्ध करना चाहता हूं, एक डेटटाइम ( updated_at) है, और दूसरा एक दशमलव (मूल्य) है

मैं अपडेटेड_एट द्वारा पहले सॉर्ट करने में सक्षम होना चाहूंगा, फिर, यदि एक ही दिन में कई आइटम होते हैं, तो मूल्य के आधार पर सॉर्ट करें।

जवाबों:


64

मान लें कि आप MySQL का उपयोग कर रहे हैं,

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

अन्य उत्तरों से भेद पर ध्यान दें। updated_atस्तंभ एक पूर्ण टाइमस्टैम्प हो जाएगा, इसलिए यदि आप प्रकार के आधार पर करना चाहते हैं दिन यह अद्यतन किया गया था, तो आप एक समारोह का उपयोग करने के टाइमस्टैम्प से सिर्फ तारीख हिस्सा पाने के लिए की जरूरत है। MySQL में, वह है DATE()


7
"अस्पष्ट कॉलम" संदेशों के साथ बेतरतीब ढंग से टूटने से जुड़ने से रोकने के लिए, आपको निम्नलिखित अधिक मजबूत संस्करण का उपयोग करना चाहिए: :order => ["DATE(#{table_name}.updated_at)", :price](नोट :priceएक प्रतीक है।)
जोइस

मुझे अपने ऑर्डर कॉलम को इस orderतरह से बचाना था:Model.all(:order => "day asc, `order` asc")
अनुदान


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

चाल चलेगा।

अपडेट करें:

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

जाने के लिए रेल 3 रास्ता है। ( साभार @cpursley )


4
धन्यवाद @Erik - मुझे पता है कि यह उत्तर पुराना है इसलिए यहाँ उन लोगों के लिए मेरी चेतावनी है जो इसे अब देख रहे हैं: इस पद्धति को शुरू किया गया है Rails 3.2। Thing.all उपयोग के बजाय =)
Abdo

सही है, इसने मेरे लिए अच्छा काम किया: Thing.all.order("updated_at DESC, price ASC")
cpursley

1
जब आपके द्वारा छांटे गए मूल्यों को कम करने की आवश्यकता थी, तो आपका अपडेट मेरे लिए उपयोगी था 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इसे बदलूंगा ताकि किसी व्यक्ति को पता चले कि यह बहुवचन है। केवल एक सलाह।
तस्स ass

1
मुझे लगता है कि एक और विशेष उदाहरण को संपादित करना चाहिए: जैसे मॉडल = मॉडल.ऑर्डर ({मूल्य:: डेस}, {दिनांक::
डेस

अगर किसी ने इसे चिपकाया और अपरिभाषित विधि त्रुटि देखी, तो यहां एक छोटा टाइपो है। इसके :ascबजाय होना चाहिए asc:Model.order({price: :desc}, {date: :desc}, {price: :asc})
nayiaw

18

वास्तव में इसे एक्टिव रिकॉर्ड का उपयोग करने के कई तरीके हैं। एक जिसका उल्लेख ऊपर नहीं किया गया है (विभिन्न स्वरूपों में, सभी मान्य होंगे):

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 इंजन


दो अलग-अलग तालिकाओं से दो स्तंभों का उपयोग करते समय यह बहुत अच्छा काम करता है जैसे: Member.includes (: मतदाता) ।आर्डर ("town_club asc")। ऑर्डर ("मतदाता.लल्ला_नाम asc")
bkunzi01

1
क्या आपके द्वारा पोस्ट किया गया एसक्यूएल मेल करता है Model.order(foo: :asc).order(:bar => :desc).order(:etc)? एसक्यूएल में ऑर्डर क्लॉज का क्रम .to_sqlउस पर चलने के दौरान मुझे जो मिलता है उसके विपरीत है।
काज

1
@Qaz यह बहुत समय पहले की बात है। मुझे लगता है कि मुझे शायद इसे ठीक करने की आवश्यकता है, मैंने कभी गौर नहीं किया। मैं बाद में दोबारा जाँच करूँगा। धन्यवाद।
रूबी रेसर


0

इनमें से किसी ने भी मेरे लिए काम नहीं किया! इंटरनेट पर ऊपर और नीचे देखने के ठीक 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.