ruby on rails - RailR में ActiveRecord मॉडल और इसकी तालिका का नाम बदलने के लिए आप माइग्रेशन कैसे लिखते हैं?




ruby-on-rails migration (3)

अन्य उत्तरों और टिप्पणियों में टेबल नामकरण, फ़ाइल नामकरण, और आपके कोड के माध्यम से grepping शामिल हैं।

मैं कुछ और चेतावनी जोड़ना चाहता हूं:

आइए आज एक वास्तविक दुनिया का उदाहरण इस्तेमाल करें जिसका मैंने सामना किया: 'मर्चेंट' से 'बिजनेस' तक एक मॉडल का नाम बदलना।

  • एक ही माइग्रेशन में निर्भर टेबल और मॉडल के नाम बदलने के लिए मत भूलना। मैंने अपने मर्चेंट और मर्चेंटस्टैट मॉडल को एक ही समय में बिजनेस और बिजनेसस्टैट में बदल दिया। अन्यथा मुझे खोज-और-प्रतिस्थापन करने पर बहुत अधिक चुनना और चयन करना होगा।
  • किसी अन्य मॉडल के लिए जो आपके मॉडल पर विदेशी कुंजी के माध्यम से निर्भर करता है, अन्य टेबल 'विदेशी कुंजी कॉलम नाम आपके मूल मॉडल नाम से प्राप्त किए जाएंगे। तो आप इन निर्भर मॉडल पर कुछ rename_column कॉल भी करना चाहेंगे। उदाहरण के लिए, मुझे 'merchant_id' कॉलम को 'join_and_belongs_to_many रिश्ते के लिए) और अन्य आश्रित तालिकाओं (सामान्य has_one और has_many रिश्तों के लिए) में' business_id 'में' business_id 'का नाम बदलना पड़ा। अन्यथा मैं 'business_stat.merchant_id' जैसे कॉलम के साथ 'business.id' पर इंगित करता। कॉलम नाम बदलने के बारे में यहां एक अच्छा जवाब दिया गया है।
  • जब grepping, एक तार, बहुवचन, पूंजीकृत, लोअरकेस, और यहां तक ​​कि UPPERCASE (जो टिप्पणी में हो सकता है) के लिए अपने तारों के संस्करणों को खोजना याद रखें।
  • पहले बहुवचन संस्करणों को खोजना सबसे अच्छा है, फिर एकवचन। इस तरह यदि आपके पास अनियमित बहुवचन है - जैसे कि मेरे व्यापारियों में :: व्यवसाय उदाहरण - आप सभी अनियमित बहुवचनों को सही कर सकते हैं। अन्यथा आप अंततः, 'व्यवसाय' (3 एस) को मध्यवर्ती राज्य के रूप में समाप्त कर सकते हैं, जिसके परिणामस्वरूप अभी तक और अधिक खोज-प्रतिस्थापन हो सकता है।
  • अंधेरे से हर घटना को प्रतिस्थापित न करें। यदि आपके मॉडल नाम सामान्य प्रोग्रामिंग शर्तों के साथ टकराते हैं, अन्य मॉडलों में मूल्यों के साथ, या आपके विचारों में पाठ्य सामग्री के साथ, आप बहुत अधिक उत्सुक हो सकते हैं। मेरे उदाहरण में, मैं अपना मॉडल नाम 'बिजनेस' में बदलना चाहता था लेकिन फिर भी उन्हें अपने यूआई में सामग्री में 'व्यापारियों' के रूप में संदर्भित करता हूं। मेरे पास कैनकन में मेरे उपयोगकर्ताओं के लिए 'व्यापारी' भूमिका भी थी - यह व्यापारी भूमिका और मर्चेंट मॉडल के बीच भ्रम था जिसने मुझे मॉडल को पहले स्थान पर बदलने का कारण बना दिया।

मैं नामकरण में भयानक हूं और महसूस करता हूं कि मेरे रेल ऐप में मेरे मॉडल के लिए नामों का बेहतर सेट है।
क्या मॉडल और इसकी संबंधित तालिका का नाम बदलने के लिए माइग्रेशन का उपयोग करने का कोई तरीका है?


आपको अपनी अनुक्रमणिका को प्रतिस्थापित करने की भी आवश्यकता है:

class RenameOldTableToNewTable< ActiveRecord:Migration
  def self.up
    remove_index :old_table_name, :column_name
    rename_table :old_table_name, :new_table_name
    add_index :new_table_name, :column_name
  end 

  def self.down
    remove_index :new_table_name, :column_name
    rename_table :new_table_name, :old_table_name
    add_index :old_table_name, :column_name
  end
end

और अपनी फाइलों का नाम बदलें, मैन्युअल रूप से यहां अन्य उत्तरों के वर्णन के रूप में।

देखें: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

सुनिश्चित करें कि आप इस माइग्रेशन को लिखने के बाद रोलबैक और रोल रोल कर सकते हैं। यदि आप कुछ गड़बड़ करते हैं और माइग्रेशन के साथ फंस जाते हैं तो यह मुश्किल हो सकता है जो अब कुछ ऐसा करने की कोशिश करता है जो अब मौजूद नहीं है। सर्वश्रेष्ठ डेटाबेस को कचरा करें और फिर से शुरू करें यदि आप वापस रोल नहीं कर सकते हैं। तो सावधान रहें कि आपको कुछ वापस करने की आवश्यकता हो सकती है।

साथ ही: has_ ​​या belong_to या कुछ द्वारा परिभाषित अन्य तालिकाओं में किसी भी प्रासंगिक कॉलम नाम के लिए schema_db जांचें। आपको शायद उनको संपादित करने की आवश्यकता होगी।

और अंत में, एक रिग्रेशन टेस्ट सूट के बिना ऐसा करना पागल हो जाएगा।


रेल 4 में मुझे केवल डीफ़ परिवर्तन करना था

def change
  rename_table :old_table_name, :new_table_name
end

और मेरे सभी इंडेक्स का ख्याल रखा गया। पुराने लोगों को हटाकर और नए जोड़कर मुझे इंडेक्स को मैन्युअल रूप से अपडेट करने की आवश्यकता नहीं थी।

और यह इंडेक्स के संबंध में ऊपर या नीचे जाने के लिए परिवर्तन का उपयोग करके भी काम करता है।





migration