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


408

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


11
मैंने सर्च इंजन मैचों में सुधार के लिए इस प्रश्न में "ActiveRecord" जोड़ने का सुझाव दिया। मैं इसके लिए "ActiveRecord rename table" का उपयोग कर रहा हूँ।
लैंडन कुह्न

6
यदि आप माइग्रेशन का उपयोग कर रहे हैं, तो यह समस्या अधिक जटिल है जितना लगता है। आपके द्वारा तालिका का नाम बदलने के बाद चयनित समाधान बस वापस जाने और मैन्युअल रूप से मॉडल, नियंत्रक आदि का नाम बदलने के लिए कहता है। यदि आप ऐसा करते हैं, तो आपके पुराने नाम से आपके मॉडल को संदर्भित करने वाले सभी पुराने माइग्रेशन विफल हो जाएंगे। इसलिए जब कोई आपका रेपो क्लोन करता है और चलाने की कोशिश करता है rake db:migrate, तो वह विफल हो जाएगा। आप वापस जा सकते हैं और उन नामों को माइग्रेशन में बदल सकते हैं, लेकिन यह गड़बड़ हो जाएगा। आप इसे नाम बदलने के बजाय एक पूरी तरह से नया मॉडल बनाने से बेहतर हो सकते हैं।
andrew

4
@andrewhannigan: अगर कोई आपका रेपो क्लोन करता है और सिर्फ रन करता है तो क्या आपकी बात गलत नहीं है rake db:schema:load?
israsrasci

3
@ अविनाशी: बिल्कुल। वास्तव में, rake db:migrateएक डेटाबेस को खरोंच से सेट करने के लिए चल रहा है, सक्रिय रूप से हतोत्साहित किया जाता है, ठीक इसके द्वारा andrew की चिंताओं के कारण।
Giuseppe

जवाबों:


584

यहाँ एक उदाहरण है:

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

  def self.down
    rename_table :new_table_name, :old_table_name
  end
end

मुझे स्वयं जाकर मॉडल घोषणा फ़ाइल का नाम बदलना पड़ा।

संपादित करें:

रेल 3.1 और 4 में, ActiveRecord::Migration::CommandRecorderरीनेम_टेबल माइग्रेशन को उल्टा करना जानता है, इसलिए आप ऐसा कर सकते हैं:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
    rename_table :old_table_name, :new_table_name
  end 
end

(आपको अभी भी अपनी फ़ाइलों का नाम बदलना है और मैन्युअल रूप से जाना है।)


6
@mathee: हाँ, आपको इसे मैन्युअल रूप से बदलना होगा, या एक आईडीई का उपयोग करना होगा जो रूबी रिफैक्टिंग कर सकता है और इसे आपके संस्करण नियंत्रण प्रणाली में कर सकता है।
पिलीनो

13
git grep आपका दोस्त है। मैं अभी एक एक्टिविटी को एक आदत में बदल रहा हूं: git grep -i activitबहुत खुलासा है।
फेलिक्स राबे

1
आपको अपने नियंत्रक की सामग्री को भी बदलना होगा, है ना?
1

5
और अपने मार्गों मत भूलना।
डैन हरमन

26
इसके अलावा, एक सिर के रूप में, आप rename_table कॉल में अपनी तालिका नाम के बहुवचन संस्करण का उपयोग करना चाहते हैं।
हान

66

रेल 4 में मुझे केवल इतना करना था कि वह परिवर्तन था

def change
  rename_table :old_table_name, :new_table_name
end

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

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


47

अन्य जवाब और टिप्पणियाँ कवर किए गए टेबल का नाम बदलने, फ़ाइल का नाम बदलने और अपने कोड के माध्यम से grepping करते हैं।

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

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

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

26

आपको अपने अनुक्रमित को बदलने की भी आवश्यकता है:

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

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

इसके अलावा: किसी भी प्रासंगिक स्तंभ नामों के लिए किसी भी_से या संबंधित_तो या कुछ और के लिए स्कीमा_डब की जाँच करें। आपको शायद उन्हें भी संपादित करना होगा।

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


11
4.0.0.beta1 माइग्रेशन की पटरियों के लिए, इंडेक्स को मैन्युअल रूप से अपडेट करना आवश्यक नहीं है। एआर इसे खुद से अपडेट करता है।
फ्रीमैनॉइड

1

आप इस आदेश पर अमल कर सकते हैं: रेल प्रवासन का नाम बदलें rename_ {old_table_name} से {new_table_name}

जब आप फ़ाइल को संपादित करते हैं और इस कोड को विधि परिवर्तन में जोड़ते हैं

rename_table: {old_table_name},: {new_table_name}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.