रेल प्रवास में मौजूदा तालिका में एक स्तंभ जोड़ना


340

मेरे पास एक उपयोगकर्ता मॉडल है जिसे एक :emailकॉलम की आवश्यकता है (मैं प्रारंभिक पाड़ के दौरान उस कॉलम को जोड़ना भूल गया)।

मैंने माइग्रेशन फ़ाइल को खोला और जोड़ा t.string :email, किया rake db:migrateऔर प्राप्त किया NoMethodError। फिर मैंने लाइन जोड़ी

add_column :users, :email, :string

फिर से rake db:migrate, फिर से NoMethodError। क्या मुझे यहाँ एक कदम याद आ रहा है?

संपादित करें: यहाँ माइग्रेशन फ़ाइल है।

class CreateUsers < ActiveRecord::Migration  
  def self.up  
    add_column :users, :email, :string  
    create_table :users do |t|  
      t.string :username  
      t.string :email  
      t.string :crypted_password  
      t.string :password_salt  
      t.string :persistence_token  

      t.timestamps  
    end  
  end  

  def self.down  
    drop_table :users  
  end  
end

जवाबों:


573

यदि आपने अपना मूल माइग्रेशन पहले ही चला लिया है (इसे संपादित करने से पहले), तो आपको एक नया माइग्रेशन ( rails generate migration add_email_to_users email:stringचाल चलेंगे) उत्पन्न करने की आवश्यकता है । यह एक माइग्रेशन फ़ाइल बनाएगी जिसमें लाइन होगी: add_column :users, email, string फिर a करें rake db:migrateऔर यह नया माइग्रेशन चलाएगा, जिससे नया कॉलम बनेगा ।

यदि आपने अभी तक मूल माइग्रेशन नहीं चलाया है तो आप इसे संपादित कर सकते हैं, जैसे आप करने की कोशिश कर रहे हैं। आपका माइग्रेशन कोड लगभग सही है: आपको बस add_columnपूरी तरह से लाइन को हटाने की जरूरत है (यह कोड टेबल पर कॉलम जोड़ने की कोशिश कर रहा है, इससे पहले कि टेबल बनाई गई है, और आपके टेबल क्रिएशन कोड को पहले से ही अपडेट किया जा चुका है, t.string :emailवैसे भी शामिल करने के लिए )।


6
बस स्पष्ट होने के लिए, हम बहुवचन का उपयोग करते हैं? तो यह add_email_to_usersऔर नहीं है add_email_to_user?
पर्पलजेट

9
सही बात। रेल में तालिका के नाम हमेशा बहुवचन होते हैं (डीबी सम्मेलनों से मेल खाने के लिए)।
कैमडेज़

2
आप rails db:migrateअंतिम चरण के लिए भी उपयोग कर सकते हैं ।
डायलन वैंडर बर्ग

क्या किसी तालिका में किसी विशेष स्थिति पर एक नया स्तंभ बनाना संभव है। उदाहरण के लिए अगर मैं मौजूदा "ईमेल" फ़ील्ड के बाद नया क्षेत्र "स्थिति" बनाना चाहता हूं?
नीरज

2
@ आप शायद अब तक इसका जवाब दें, लेकिन अन्य साधकों के लिए, हां आप उदाहरण के t.string :column_x, limit: 10, after: :column_yलिए जैसे (रेल 4 के लिए कम से कम)
244

123

रेल कमांड कंसोल पर इस कमांड का उपयोग करें

rails generate migration add_fieldname_to_tablename fieldname:string

तथा

rake db:migrate

इस माइग्रेशन को चलाने के लिए


57

कभी-कभी rails generate migration add_email_to_users email:stringइस तरह से एक प्रवास पैदा करता है

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end

उस स्थिति में आपको मैन्युअल रूप add_columnसे changeनिम्न करना होगा :

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end

और फिर चला rake db:migrate


1) क्या rails generate migration add_email_to_users email:stringइसे bundle exec rails cटर्मिनल के भीतर या बाद में चलाया जाना चाहिए ? 2) क्वेरी निष्पादित करते समय जनरेट की गई फ़ाइल को कहाँ रखा जाता है?
sofs1

28

आप भी कर सकते हैं

rake db:rollback

यदि आपने तालिकाओं में कोई डेटा नहीं जोड़ा है। तब ईमेल कॉलम को उसमें जोड़कर माइग्रेशन फ़ाइल को संपादित करें और फिर कॉल करें

rake db:migrate

यह तब काम करेगा जब आपके सिस्टम में 3.1 रैलियाँ होंगी।

यह करने का बहुत सरल तरीका परिवर्तन है माइग्रेशन फ़ाइल में परिवर्तन जैसा है वैसा होने दें। उपयोग

$rake db:migrate:redo

यह अंतिम माइग्रेशन को वापस रोल करेगा और इसे फिर से माइग्रेट करेगा।


21

एक कॉलम जोड़ने के लिए मुझे बस इन चरणों का पालन करना था:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    विकल्प

    rails generate migration addFieldnameToTablename

    एक बार माइग्रेशन उत्पन्न होने के बाद, माइग्रेशन को संपादित करें और उन सभी विशेषताओं को परिभाषित करें, जो आप चाहते हैं कि कॉलम में जोड़ा गया है।

    नोट : रेल में तालिका के नाम हमेशा बहुवचन होते हैं (DB सम्मेलनों से मेल खाने के लिए)। पहले उल्लेख किए गए चरणों में से एक का उपयोग करके उदाहरण-

    rails generate migration addEmailToUsers

  2. rake db:migrate

या

  1. आप db/schema.rbSQL क्वेरी में इच्छित कॉलम जोड़ें, से स्कीमा बदल सकते हैं ।
  2. यह आदेश चलाएँ: rake db:schema:load

    चेतावनी / नोट

    इस बात को ध्यान में रखें कि, rake db:schema:loadस्वचालित रूप से चलाने से आपकी तालिकाओं का सारा डेटा नष्ट हो जाता है।


मैंने ऐसा किया, लेकिन इसने "मचान" को फिर से नहीं बनाया और नया कॉलम जोड़ा। मैं कैसे कर सकता हूँ कि "स्वचालित रूप से"?
जॉन वूटन

@ जॉन वूटन, आप पाड़ को हटाना चाहते हैं और फिर से गुजर सकते हैं। इसी पलायन को भी छोड़ें।
अफोलाबी ओलावुवा अकिंवुमी

एक नोट जोड़ने के लिए: माइग्रेशन को बदले बिना स्कीमा को बदलना अन्य डेवलपर्स के साथ समस्या पैदा कर सकता है जो ऐप को बनाए रखते हैं।
BKSpurgeon

3

जब मैंने ऐसा किया है, तो मूल माइग्रेशन को फ़िड करने के बजाय, मैं ऊपर अनुभाग में केवल एक ऐड कॉलम और डाउन अनुभाग में एक ड्रॉप कॉलम के साथ एक नया बनाता हूं।

आप मूल को बदल सकते हैं और यदि आप बीच में पलायन करते हैं तो इसे फिर से चलाएँ, लेकिन इस मामले में मुझे लगता है कि यह एक माइग्रेशन है जो ठीक से काम नहीं करेगा।

जैसा कि वर्तमान में पोस्ट किया गया है, आप कॉलम जोड़ रहे हैं और फिर तालिका बना रहे हैं।

यदि आप ऑर्डर बदलते हैं तो यह काम कर सकता है। या, जैसा कि आप किसी मौजूदा माइग्रेशन को संशोधित कर रहे हैं, बस एक अलग ऐड कॉलम करने के बजाय इसे बनाएँ तालिका में जोड़ें।


1

तुम भी तालिका का उपयोग कर तालिका स्तंभों के लिए मजबूर कर सकते हैं force: trueयदि आप तालिका में पहले से मौजूद हैं, तो आप तालिका हैं।

उदाहरण :

ActiveRecord::Schema.define(version: 20080906171750) do
  create_table "authors", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

1

नए कॉलम जोड़ने के लिए आप माइग्रेशन में विशेष change_table मेथड का उपयोग कर सकते हैं:

change_table(:users) do |t|
  t.column :email, :string
end

0

आप अंतिम माइग्रेशन को रोलबैक कर सकते हैं

rake db:rollback STEP=1

या इस विशिष्ट माइग्रेशन को रोलबैक करें

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

और फ़ाइल को संपादित करें, फिर चलाएं rake db:mirgate


0

आप यह भी कर सकते हैं .. रेल प्रवासन add_column_to_users ईमेल: स्ट्रिंग

फिर रेक डीबी: माइग्रेट भी जोड़ें: आपके उपयोगकर्ता नियंत्रक में ईमेल विशेषता;

अधिक विस्तार के लिए http://guides.rubyonrails.org/active_record_migrations.html देखें


0

आप स्तंभ से पहले या स्तंभ के बाद का उपयोग करके किसी विशिष्ट स्थिति में स्तंभ जोड़ सकते हैं जैसे:

rails generate migration add_dob_to_customer dob:date

माइग्रेशन फ़ाइल निम्नलिखित कोड जनरेट करेगी: को छोड़कर: ईमेल। आपको इसके बाद जोड़ने की आवश्यकता है: ईमेल या पहले: ईमेल

class AddDobToCustomer < ActiveRecord::Migration[5.2]
  def change
    add_column :customers, :dob, :date, after: :email
  end
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.