रेलिंग में नाम बदलना


154

मैं एक तालिका का नाम बदलना चाहता हूं ... (कोई भी तालिका)

मैंने कोड की इस लाइन की कोशिश की:

ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)

यहाँ अजीब बात है। मुझे पता है कि मुझे यह पहली बार काम कर रहा है, लेकिन अब मुझे यह त्रुटि मिलती है: ActiveRecord के लिए अपरिभाषित विधि `rename_table ':: ConnectionAdapters :: SchemaStatements: मॉड्यूल

क्या मुझे कुछ सेट करने की ज़रूरत थी?

जवाबों:


248

आप आमतौर पर इस तरह की चीज को माइग्रेशन में करेंगे:

class RenameFoo < ActiveRecord::Migration
  def self.up
    rename_table :foo, :bar
  end

  def self.down
    rename_table :bar, :foo
  end
end

1
धन्यवाद कि काम किया! मैं अभी भी हैरान हूँ कि पिछली पंक्ति यद्यपि नहीं थी। ओह अच्छा ..
टॉमी

@ टॉमी, rename_tableविधि में परिभाषित किया गया है ActiveRecord::ConnectionAdapters::SchemaStatements। यह अन्य मॉड्यूल में मिश्रित होने के लिए है। आप इसे सीधे चलाने के लिए चाहते हैं, तो मुझे लगता है कि तुम कर सकते होinclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
कैम

यदि आप बहुत इच्छुक थे, तो आप ActiveRecord :: Migration.rename_table (: foo,: bar) का उपयोग कर सकते हैं। लेकिन माइग्रेशन सबसे अच्छा काम करता है। क्या आप भी मॉडल का नाम बदलना चाहते हैं या मॉडल के नाम को पुराना बनाए रखना चाहते हैं? यदि ऐसा है तो आप "set_table_name: bar" का उपयोग करके ActiveRecord मॉडल में तालिका का नाम निर्दिष्ट करना चाह सकते हैं।
आदित्य संघी

1
आप अप एंड डाउन के बजाय 'परिवर्तन' विधि के साथ माइग्रेशन के लिए नए फॉर्म का उपयोग कर सकते हैं। उदाहरण
मेगाटक्स

डीईएफ़ परिवर्तन, आधुनिक आईटी रेल कार्यान्वयन में स्व.अप / डीफ़.फ़ेयर.डाउन को नहीं। बाद वाला करना चुपचाप विफल हो जाएगा।
२१:२

294

याद रखें कि रेल> = 3.1 में आप changeविधि का उपयोग कर सकते हैं ।

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

37
यह भी से किसी भी अनुक्रमित विस्थापित करेगा :old_table_nameकरने के लिए:new_table_name
गेविन मिलर

7
बस थोड़ी सी टिप्पणी: शायद बदलकर: old_ame_things,: new_onym_things लोगों को यह याद दिलाने के लिए कि एक्टिवरकॉर्ड में टेबल के नाम आमतौर पर बहुवचन हैं।
कार्पेला

24

.rename_tableएक इंस्टेंस विधि है, क्लास विधि नहीं है, इसलिए कॉलिंग Class.methodकाम नहीं कर रही है। इसके बजाय आपको कक्षा का एक उदाहरण बनाना होगा, और इस तरह विधि को कॉल करना होगा:Class.new.method

[संपादित करें] इस उदाहरण में, ActiveRecord::ConnectionAdapters::SchemaStatementsएक वर्ग भी नहीं है (जैसा कि कैम द्वारा बताया गया है), जिसका अर्थ है कि आप इसके बारे में एक उदाहरण भी नहीं बना सकते हैं जैसा कि मैंने ऊपर कहा है। और अगर आपने कैम के उदाहरण का उपयोग किया है class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;, तब भी यह rename_tableअपवाद के रूप में काम नहीं करेगा ।

दूसरी ओर, ActiveRecord::ConnectionAdapters::MysqlAdapter है एक वर्ग, और यह संभावना इस वर्ग आप (क्या डेटाबेस का उपयोग कर रहे हैं पर निर्भर करता या SQLite या PostgreSQL,) अपनी मेज नाम बदलने के लिए उपयोग करने के लिए चाहते हैं। अब, जैसा कि होता है, ActiveRecord::ConnectionAdapters::MysqlAdapterपहले से ही सुलभ है Model.connection, इसलिए आपको Model.connection.rename_tableअपने आवेदन में किसी भी मॉडल का उपयोग करते हुए पूरी तरह से सक्षम होना चाहिए । [/ संपादित करें]

हालाँकि, यदि आप किसी तालिका को स्थायी रूप से पुनर्नामित करना चाहते हैं, तो मैं यह करने के लिए एक प्रवास का उपयोग करने का सुझाव दूंगा। यह आसान है और रेल के साथ अपने डेटाबेस संरचना में हेरफेर करने का पसंदीदा तरीका है। यह कैसे करना है:

# Commandline
rails generate migration rename_my_table

# In db/migrate/[timestamp]_rename_my_table.rb:
class RenameMyTable < ActiveRecord::Migration
  def self.up
    rename_table :my_table, :my_new_table
  end

  def self.down
    rename_table :my_new_table, :my_table
  end
end

फिर, आप अपना माइग्रेशन rake db:migrate(जिसे कॉल self.upविधि कह सकते हैं) चला सकते हैं , और माइग्रेशन को पूर्ववत करने के लिए rake db:rollback(जिसे कॉल करते हैं self.down)।


मैं मानता हूँ कि rename_tableएक उदाहरण विधि है, लेकिन यह एक वर्ग में परिभाषित नहीं है, इसलिए कॉल करने के लिए आपका सुझाव Class.new.methodकाम नहीं करेगा (उदाहरण के लिए: ActiveRecord के लिए ActiveRecord::ConnectionAdapters::SchemaStatements.newत्रुटि oMethodError: undefined method 'नया देता है :: ConnectionAdapters :: SchemaStatements: मॉड्यूल `
कैम

1
यह भी इंगित करने के लायक है, कि यदि आपके पास तालिका से संबंधित कोई मॉडल है जिसका आप नाम बदल रहे हैं, तो चल रहे हैं rake db:migrateया मॉडल का नाम बदलकर rake db:rollbackफ़ाइल नहीं रखेंगे। आपको Model.rb फ़ाइल को मैन्युअल रूप से बदलना होगा।
9monkeys

1
नए रेल संस्करणों में (उदाहरण के लिए 5.x) आप self.up और self.down के बजाय एक परिवर्तन विधि का उपयोग कर सकते हैं , क्योंकि रेल इसके द्वारा भी रोलबैक कर सकते हैं। तो बस यह कोड पर्याप्त है :। । । । । वैसे: के अंदर आप एक इन आदेशों का उपयोग: , , , , , , ,def change rename_table :my_table, :my_new_table endchangeadd_columnadd_indexadd_timestampscreate_tableremove_timestampsrename_columnrename_indexrename_table
ब्यूटी

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