2013-03-22 8 views
5

मैं माइग्रेशन के दौरान चलने वाली अपनी टाइमस्टैम्प विधि लिखने का प्रयास कर रहा हूं। जो स्थान पर है वह अब क्षेत्र पर एक NOT_NULL बाधा जोड़ता है, और मैं वास्तव में वास्तव में यह नहीं चाहता हूं।रेल/रूबी मैं माइग्रेशन विधि टाइमस्टैम्प को कैसे ओवरराइड कर सकता हूं

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

नई स्कीमा किसी भी डेटा के बिना पाठ्यक्रम के अलावा, अन्य स्कीमा में तालिकाओं की एक सटीक प्रति होना चाहिए।

मैं चला गया अंतिम माइग्रेशन रेल के थोड़ा पुराने संस्करण का उपयोग कर रहा था। अभी भी 3 में लेकिन एक स्मीज पुराना है। जब यह टाइमस्टैम्प बनाया गया तो वे निरर्थक थे। जब मैं दूसरे दिन (नए रेलों पर) माइग्रेशन चलाता था ... ठीक है सभी फ़ील्ड अब NOT_NULL

मेरे पास कोड है जो इस विचार के साथ विकसित किया गया था कि अपडेट किया गया था जब रिकॉर्ड अपडेट किया गया था ... जब यह बनाया गया था। (तृतीय पक्ष ऐप्स और डेटाबेस "फ़ंक्शंस" रिकॉर्ड्स बनाते हैं) .. रिकॉर्ड बनाने वाले तृतीय पक्ष ऐप्स और डेटाबेस फ़ंक्शंस नए स्कीमा पर गिर रहे हैं ... मैं अंदर गया हूं और सभी NOT_NULL बाधाओं को हटा दिया है टेबल मैन्युअल रूप से, लेकिन मैं अपने माइग्रेशन कार्य में क्लीनअप को सही नहीं लिखना चाहता हूं, ताकि सभी भावी तालिकाओं को सही किया जा सके ..

मुझे लगता है कि टाइमस्टैम्प विधि को ओवरराइड करना सबसे अच्छा काम था बदल दिया, उस पर वापस जो मौजूदा कोड तोड़ नहीं था।

तो मुझे कारण/ओवरराइड करने की आवश्यकता है ..
मेरा प्रश्न अब है ... मैं विधि को कैसे ओवरराइड कर सकता हूं। मैं यह करने के लिए एक स्पष्ट वर्ग पथ नहीं देख सकते हैं और मैं वास्तव में यकीन है कि यह कैसे ओवरराइड करने के लिए नहीं कर रहा हूँ ..

उत्तर

4

इसे एक बंदर पैच में रखें ... जितना आसान!

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition 
    def timestamps(*args) 
    options = args.extract_options! 
    column(:created_at, :datetime, options) 
    column(:updated_at, :datetime, options) 
    end 
end 

जैसा मैनीक ने कहा। इस "फिक्स" के कारण रेलों के अपडेट को अनदेखा कर दिया जाएगा।

लेकिन उनकी प्रारंभिक पेशकश वही करती है। अपने फिक्स को समायोजित करने के लिए, आपको ओएल 'माइग्रेशन के माध्यम से वापस जाना होगा और नए कोड के साथ "टाइमस्टैम्प" को प्रतिस्थापित करना होगा। उसमें जोड़ें कि आपको भविष्य के सभी ऑटो-जेनरेट किए गए माइग्रेशन को भी बदलना होगा।

मुझे नहीं लगता कि यह DRY के साथ अच्छी तरह से फिट बैठता है .. न ही यह SPOT में फिट है।

बस बी सावधान!

1

क्या बुराई है:

create_table :foo do |t| 
    t.text :bar 
    t.datetime :created_at 
    t.datetime :updated_at 
end 

?

+0

मेरे पास पहले से ही 50 से अधिक माइग्रेशन हैं, मैं इन सभी को इस प्रतिमान में बदलने के माध्यम से नहीं डालना चाहता हूं। मैं रेलों में कोड को बदलना नहीं चाहता हूं, जो मचान बनाते हैं ताकि यह टाइमस्टैम्प के बजाए टूटी हुई टाइमटाइम में डाल सके। – baash05

+3

@ डेवेटफ्लो माइग्रेशन बदलना निश्चित रूप से आपको प्रश्न लिखने से कम ले जाएगा :) जहां ओवरराइड करना है: निश्चित रूप से कोई भी डिबगिंग सक्षम के साथ रेक कार्यों को चला सकता है? create_table ब्लॉक के अंदर 'डीबगर' कॉल रखें, टाइमस्टैम्प विधि में कदम उठाएं, आपको फ़ाइल स्थान प्राप्त करना चाहिए। मैं व्यक्तिगत रूप से इसकी अनुशंसा नहीं करता, क्योंकि यह भविष्य के रेल संस्करणों में भी बदल सकता है। – maniek

+0

जैसा कि मैंने कहा था कि मेरे पास 50 से अधिक माइग्रेशन हैं, मुझे उन्हें सभी बदलना होगा, और रेलों द्वारा उत्पन्न सभी भावी प्रवासन को बदलना होगा।मुझे यह भी दस्तावेज करना होगा कि दूसरों को माइग्रेशन रेलों को बदलना होगा। डीबगर तर्क ... अब यह स्मार्ट है। भविष्य के संस्करणों में बदलाव के लिए। मैं विशेष रूप से उस से बचने की कोशिश कर रहा हूं। यदि वे फ़ील्ड नाम बदलते हैं (उदाहरण के लिए), तो मेरे पास एक डेटाबेस है, दो स्कीमा जो समान होना चाहिए, लेकिन अलग-अलग फ़ील्ड नाम हैं। – baash05

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