2010-12-03 13 views
5

मैं हाल ही में कुछ माइग्रेशन लिख रहा हूं जो अपरिवर्तनीय प्रवासन छतरी के नीचे आते हैं। लेकिन वे दुनिया के अंतहीन नहीं हैं। यदि आप चाहें तो आप उन्हें वापस रोल कर सकते हैं। इस समय मेरे पास परिदृश्य कई लोगों के साथ कई रिश्ते में बदल रहा है। इसमें एक कॉलम छोड़ना और एक नई जॉइन टेबल बनाना शामिल है। (साथ ही मॉडल में दो लाइनें)।अपरिवर्तनीय माइग्रेशन - निरस्त करने की बजाय चेतावनी और पुष्टि करें?

मैं सोच रहा था, डाउन माइग्रेशन को रद्द करने के बजाय, मैं कुछ कह सकता हूं "यह माइग्रेशन [INSERT SCARY संदेश यहां है], क्या आप वाकई आगे बढ़ना चाहते हैं? वाई/एन" और फिर माइग्रेशन वापस ले जाएं वे चुनते हैं? बस एक कथन के अंदर माइग्रेशन डालें?

माइग्रेशन अपरिवर्तनीय बनाने के लिए काफी आसान है, और आमतौर पर एक अच्छा कारण होता है (उदा। डेटा पुनर्प्राप्त नहीं किया जा सकता है)। क्या इन मुद्दों को आमतौर पर माइग्रेशन लिखकर हल किया जाता है जो इसे मैन्युअल रूप से करता है?

मेरे नोबिश दिमाग में यह एक सुखद माध्यम होना अच्छा लगेगा। क्या यह बुद्धिमान है? हो सकता है कि मैं समझ में नहीं आता कि उन्हें पहली जगह में गैर-परिवर्तनीय बनाने के लिए कब किया जाए।

उत्तर

1

यदि संभव हो तो मैं हमेशा माइग्रेशन रिवर्सिबल बनाने की कोशिश करता हूं। एकमात्र समय मुझे लगता है कि मैंने समस्याओं में भाग लिया है, जब आप एक मोटे तौर पर परिभाषित डेटा मॉडल से एक बेहतर अनाज पर जाते हैं, और फिर वापस आते हैं। माइग्रेशन के परिणामों पर, पाठ्यक्रम के आधार पर, मुझे आपके समाधान का उपयोग न करने का कोई कारण नहीं दिखता है। डाउन माइग्रेशन को आपके उठाए गए त्रुटि पर टिप्पणी करने और माइग्रेशन को रिवर्स करने के लिए अपना कोड लिखने से रोकने के लिए कुछ भी नहीं रोक रहा है, लेकिन यह आपके लिए कहीं अधिक सुरक्षित है, डेटा मॉडल लिखने वाला व्यक्ति यह जानने के लिए कि कैसे वापस परिवर्तित करना है अनुमान लगाने के बजाय पिछले राज्य।

+0

"यह कहीं अधिक सुरक्षित है आपके लिए, डेटा मॉडल लिखने वाला व्यक्ति यह जानने के लिए बदलता है कि उन्हें अनुमानित करने के बजाय पिछली स्थिति में कैसे परिवर्तित किया जाए "। ठीक ठीक! यही कारण है कि मैं थोड़ा आश्चर्यचकित था कि यह विकल्प पहले से उपलब्ध नहीं था - क्योंकि यह पूरी तरह से संभव है कि कोई आपके द्वारा लिखे गए अपवाद को ओवरराइड कर देगा। – Nick

+0

रूबी के बहुत कम नियम हैं। विचार करें: http://gfredericks.com/gfrlog/post/51 तो, हम सामान्य ज्ञान, सम्मेलन और अच्छे परीक्षण पर भरोसा करते हैं :) –

1

बस इस पुरानी पोस्ट पर ठोकर खाई - जैसा कि मैंने एक ही सवाल पर किसी तरह से संघर्ष किया था।

मेरे पास दूसरा मामला था: कई से कई (एचएबीटीएम) से एक से कई तक चल रहा था। बेशक, मैं बाद में शामिल टेबल को हटाना चाहता था। मैं वास्तव में डर था कि मैं तैनाती के दौरान शामिल तालिका से डेटा पर प्रतिलिपि बनाना भूल जाऊंगा।

class DataMigrationWarning < ActiveRecord::Migration 
    def change 

    puts("********************** Data Migration Warning **********************") 
    puts("Dont forgett to save the data.") 
    puts("Next UP migration will delete table XYZ.") 
    puts("Next DOWN migration will delete field A in table BCD.") 
    puts("press y for continue.") 
    puts("press anything else for stopping.") 

    if STDIN.gets.chomp == "y" 
     puts("Ok then!") 
    else 
     fail 
    end 

    # More detailed explanation... 

    end 
end 

कमांड लाइन तो बस वहाँ में सब बातों और प्रतीक्षा करता है उपयोगकर्ता से एक इनपुट के लिए दिखाई देगा: तो मैं एक "चेतावनी" माइग्रेशन शामिल करने का फैसला। y बस अगले प्रवासन पर जाएगा। अन्य सभी इनपुट माइग्रेशन और निम्नलिखित सभी को रोक देंगे।

  1. प्रवासन:

    प्रक्रिया की तरह अंत में देखा belong_to

  2. चेतावनी प्रवास
  3. प्रवासन नए के लिए नया क्षेत्र बनाएँ: तालिका में शामिल होने के वर्ष हटाएँ
+0

बिल्कुल वही जो मैं खोज रहा था! चीजों को गंभीर बनाने के लिए एक बड़ी चेतावनी की तरह कुछ भी नहीं। धन्यवाद! – Andreas

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