8

कहें कि मेरे पास Transaction नामक एक मॉडल है जिसमें :transaction_code विशेषता है। मैं चाहता हूं कि यह विशेषता स्वचालित रूप से अनुक्रम संख्या से भर जाए जो id से भिन्न हो सकती है (उदाहरण के लिए id=1 के साथ लेनदेन transaction_code=1000 हो सकता है)।रेल पर रूबी + पोस्टग्रेएसक्यूएल: कस्टम अनुक्रमों का उपयोग

मैंने पोस्टग्रेज़ पर अनुक्रम बनाने की कोशिश की है और फिर उस अनुक्रम के nextvaltransaction_code कॉलम के लिए डिफ़ॉल्ट मान बना दिया है।

INSERT INTO transactions (transaction_code) VALUES (NULL);

यह क्या करता है एक नई पंक्ति बनाएं है: बात यह है कि अगर मैं, आतंक विरोधी पर @transaction.transaction_code के लिए किसी भी मूल्य निर्दिष्ट नहीं है जब मैं आतंक विरोधी पर एक @transaction.save जारी है, यह निम्नलिखित एसक्यूएल करने की कोशिश करता ट्रांज़ेक्शन टेबल पर, लेनदेन_code के साथ अनुक्रम के अगले भाग की गणना करने और संबंधित कॉलम पर डालने के बजाय, NULL के रूप में। इस प्रकार, जैसा कि मैंने पाया, यदि आप पोस्टग्रेस के लिए न्यूल निर्दिष्ट करते हैं, तो यह मानता है कि आप वास्तव में उस कॉलम में NULL डालना चाहते हैं, भले ही इसमें डिफ़ॉल्ट मान हो (मैं ओरेकल से आ रहा हूं जिसमें एक अलग व्यवहार है)।

  • या तो वहाँ ActiveRecord के save
  • या वहाँ से गुण को बाहर करने का एक तरीका है:

    मैं, या तो अगर यह आतंक विरोधी डेटाबेस पर या पर किया जाता है इस पर किसी भी समाधान के लिए खुला रहा हूँ एक ट्रिगर के साथ डालने से पहले एक स्तंभ के मान को बदलने के लिए एक रास्ता

  • या वहाँ एक रास्ता आतंक विरोधी
  • या किसी अन्य तरीके से भीतर इन अनुक्रम संख्या उत्पन्न करने के लिए है, जब तक यह काम करता है के रूप में :-)

अग्रिम धन्यवाद।

उत्तर

2

आप एक INSERT बयान में एक कॉलम में डिफ़ॉल्ट मान सम्मिलित करना चाहते हैं, तो आप कीवर्ड DEFAULT उपयोग कर सकते हैं - कोई उद्धरण:

INSERT INTO mytable (col1, col2) VALUES (105, DEFAULT); 

या आप बाहर में डिफ़ॉल्ट nextval(...) वर्तनी सकता है, आपका मुकदमा। manual here देखें।


कि मामले के लिए एक ट्रिगर सरल है। वास्तव में मैं क्या अनुशंसा करता हूं यदि आप यह सुनिश्चित करना चाहते हैं कि आपके अनुक्रम से केवल संख्याएं दर्ज हों, इससे कोई फर्क नहीं पड़ता।

CREATE OR REPLACE FUNCTION trg_myseq() 
    RETURNS trigger AS 
$BODY$ 
BEGIN 

NEW.mycol := nextval('my_seq'); 
RETURN NEW; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

CREATE TRIGGER myseq 
    BEFORE INSERT 
    ON mytable 
    FOR EACH ROW 
    EXECUTE PROCEDURE trg_myseq(); 

एक तरफ ध्यान दें पर: आप अपने खुद के (गैर अनुक्रमिक) संख्या 'अनुक्रम' के रूप में, मैं लिखा है एक जवाब में कि के लिए एक समाधान आवंटित करने के लिए कुछ दिनों के पहले चाहते हैं:
How to specify list of values for a postgresql sequence

+1

आपके उत्तर के लिए धन्यवाद इरविन। बात यह है कि ActiveRecord की सहेजने के तरीके में, आप एक INSERT के भीतर कीवर्ड DEFAULT "भेज नहीं सकते" (जो केस हल करेगा, हाँ)। मैं एक समाधान पसंद करूंगा जो रेलवे अनुप्रयोग पर रुबी के भीतर 100% संहिताबद्ध हो सकता है, डेटाबेस पर प्रोग्रामिंग के बजाए, जो मुझे आवश्यकतानुसार किसी अन्य डीबीएमएस में माइग्रेट करने से अक्षम कर देगा। –

+1

@ रिकार्डो: "निर्बाध रूप से दूसरे डीबीएमएस में माइग्रेट करना" एक अच्छी कल्पना है लेकिन वास्तविकता के साथ ऐसा करने के लिए बहुत कुछ नहीं है, क्षमा करें। एक ट्रिगर का एक बड़ा नकारात्मक पक्ष यह है कि आप इसे हेरोकू साझा डेटाबेस पर उपयोग करने में सक्षम नहीं होंगे। –

6

क्षण के लिए, आप प्राप्त करने में कठिनाई है और इस तरह अपने ROR मॉडल में अनुक्रम बताए अटक सकता है:

before_create :set_transaction_code_sequence 

def set_transaction_code_sequence 
    self.transaction_code = self.class.connection.select_value("SELECT nextval('transaction_code_seq')") 
end 

मैं, इस समाधान का विशेष रूप से शौकीन नहीं हूँ के बाद से मैं इस corr देखना चाहते हैं सीधे एआर में ected ... लेकिन यह चाल करता है।

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