2013-09-06 17 views
7

मेरे पास state कॉलम वाला events तालिका है। सब कुछ योजना के अनुसार चला जाता है, राज्यों केवल में से एक हो सकते हैं:पोस्टग्रेर्स: ज्ञात मूल्यों के साथ स्ट्रिंग कॉलम द्वारा ऑर्डर

  • scheduled
  • invited
  • notified
  • started
  • ended

यह द्वारा ऑर्डर करने के लिए संभव है state और निर्दिष्ट करें कि कौन सा मान firs आता है टी, दूसरा, तीसरा, आदि ...?

बोनस अंक: क्या रेलवे 3 में आसानी से ऐसा करने का कोई तरीका है?

उत्तर

12

1. यदि आप सिर्फ postgres में एक एसक्यूएल की जरूरत है, यहाँ यह है:

select * from events 
order by (case state 
      when 'scheduled' then 1 
      when 'notified' then 2 
      when 'invited' then 3 
      when 'started' then 4 
      when 'ended' then 5 
      end)  

आप एसक्यूएल में राज्यों का क्रम बदल सकते, माणिक कोड बदलने की कोई आवश्यकता, खेलने एसक्यूएल बेला: http://sqlfiddle.com/#!12/976e9/3

2. एमयू के सुझाव में, आप एक एनम प्रकार का उपयोग कर सकते हैं, यदि आपको ऑर्डर बदलने की आवश्यकता है, तो यह अधिक कुशल है, आप enum को फिर से बना सकते हैं। इस एसक्यूएल बेला देखें: http://sqlfiddle.com/#!12/f6f3d/2

CREATE TYPE states AS ENUM ('invited', 'scheduled', 'notified', 'started', 'ended'); 
create table events(
    name varchar(100), 
    state states 
); 

select * from events order by state; 

3.In शुद्ध माणिक तरह, आप एक हैश परिभाषित कर सकते हैं:

test_hash = {'scheduled'=>1, 'notified'=>2, 'invited'=>3, 'started'=>4, 'ended'=>5} 
Events.all.sort! {|x, y| test_hash[x.state] <=> test_hash[y.state]} 

4.But मेरी राय में, आप "राज्यों" नाम की एक तालिका जोड़ना चाहिए, कॉलम "नाम" और "अनुक्रम" के साथ, और "अनुक्रम" में ऑर्डर निर्दिष्ट करें। तब "घटनाओं" और "राज्यों" में शामिल हों। जब आप ऑर्डर बदलते हैं, तो आपको कोड बदलने की आवश्यकता नहीं होती है।

+3

आप PostgreSQL में 'enum' प्रकार का भी उपयोग कर सकते हैं, वे समझदारी से सॉर्ट करते हैं। ओटीओएच, 'एनम' के साथ अच्छा खेलने के लिए एआर प्राप्त करने की कोशिश कर रहा है उससे अधिक काम हो सकता है। –

+0

हां, आप सही हैं, मुझे 'enum' के बारे में बहुत कुछ पता है, मैंने कोशिश की और उत्तर में अपना सुझाव जोड़ा, क्या मैं सही ढंग से समझता हूं? अगर कुछ गलत है। कृपया इसे इंगित करें, धन्यवाद :) – Bigxiang

+0

["एनम प्रकार में मानों का क्रम वह क्रम है जिसमें टाइप बनाए जाने पर मान सूचीबद्ध किए गए थे।"] (http://www.postgresql.org/docs/ वर्तमान/स्थिर/डेटाटाइप-enum.html # एएन 6387) तो, हाँ, आपके पास एक और विकल्प है। लेकिन मुझे यकीन नहीं है कि ActiveRecord कितनी अच्छी तरह से खेलेंगे। –

संबंधित मुद्दे