रेल 3 माइग्रेशन: संदर्भ कॉलम जोड़ना?


162

अगर मैं एक नई रेल बनाऊं तो 3 माइग्रेशन (उदाहरण के लिए)

rails g migration tester title:tester user:references

सब कुछ ठीक काम करता है ... हालाँकि अगर मैं किसी रेखा के साथ किसी कॉलम को जोड़ता हूँ:

rails g migration add_user_to_tester user:references

संदर्भ क्षेत्र मान्यता प्राप्त नहीं है। संक्षेप में, सवाल यह है: मैं कमांड लाइन से रेल प्रवास के लिए एक संदर्भित स्तंभ कैसे जोड़ूं?

जवाबों:


205

यदि आप रेल 4.x का उपयोग कर रहे हैं, तो आप इस तरह से संदर्भ के साथ माइग्रेशन उत्पन्न कर सकते हैं:

rails generate migration AddUserRefToProducts user:references

जैसे आप रेल गाइड पर देख सकते हैं


1
उदाहरण के लिए edgeguides.rubyonrails.org/active_record_migrations.html से खंड 2.1 देखें ।
बी सेवन

2
आप ऑटो उत्पन्न नाम के बजाय विदेशी कुंजी के लिए एक कॉलम नाम कैसे निर्दिष्ट करते हैं?
j

@jwill आप पॉलिमॉर्फिक का उपयोग कर सकते हैं: उपयोगकर्ता: संदर्भ {पॉलीमॉर्फिक}।
पाउलो फिडाल्गो

@PaooFidalgo क्या आप इस बारे में कुछ बता सकते हैं कि कैसे करें? लिंक के कुछ गाइड हो सकता है? (बहुरूपी के बारे में बात करते हुए)
अनवर


186

EDIT : यह एक पुराना उत्तर है और इसे रेल्स 4.x + के लिए लागू नहीं किया जाना चाहिए

जब आप अपने संदर्भित वर्ग में पूर्णांक आईडी का उपयोग कर सकते हैं तो आपको संदर्भ जोड़ने की आवश्यकता नहीं है।

मैं कहता हूं कि एक सादे पूर्णांक के बजाय संदर्भ का उपयोग करने का लाभ यह है कि मॉडल को מ_to के साथ पूर्वनिर्धारित किया जाएगा और चूंकि मॉडल पहले से ही बनाया गया है और प्रभावित नहीं होगा जब आप किसी मौजूदा चीज को स्थानांतरित करते हैं, तो उद्देश्य एक तरह का खो जाता है।

इसलिए मैं इसके बजाय ऐसा करना चाहूंगा:

rails g migration add_user_id_to_tester user_id:integer

और फिर मैन्युअल रूप से अंतर्गत जोड़ें _to: परीक्षक मॉडल में उपयोगकर्ता


9
लेकिन यह डेटाबेस पर उपयुक्त विदेशी कुंजी बाधाओं का निर्माण नहीं करेगा जो इसका समर्थन करते हैं, है ना?
अबाहगट

19
जब तक आप प्लगइन्स को आपके लिए करने के लिए नहीं जोड़ते हैं, तब तक afaik Rails कभी भी डेटाबेस पर विदेशी कुंजी प्रतिबंध नहीं बनाता है।
डैनमेनने

बस इस पोस्ट का अध्ययन करते हुए, pls मैं सभी के बाद संदर्भ कैसे जोड़ूं
एल नीनो

13
उपयोगकर्ता के साथ अनुक्रमणिका जोड़ना याद रखें: पूर्णांक: अनुक्रमणिका
रिकापाई

3
उत्तर दिनांकित है, आधुनिक रेल के लिए @ पाउलो का उत्तर देखें।
OneHoopyFrood

102

कृपया ध्यान दें कि आपको उस कॉलम पर भी एक सूचकांक की आवश्यकता होगी।

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end

1
क्यों? क्या यह अधिकांश संबंध_ संबंधों के लिए सही है?
अहानिबेकाड

यह वास्तव में प्रदर्शन के कारणों के लिए है और यदि आपके पास has_many / has_one है जो उस संबंध के दूसरे पक्ष से है जो संबंध में है। यदि आप पूरी तरह से सुनिश्चित हैं कि आप user.testersसूचकांक से बाहर नहीं निकलेंगे
यूजीन

1
rails g migration ...उत्पन्न add_reference :installs, :device, index: trueजो भी सूचकांक पैदा करता है।
बी सेवन

49

ऊपर बताए गए दो पिछले चरणों के साथ, आप अभी भी विदेशी कुंजी की कमी महसूस कर रहे हैं। यह काम करना चाहिए:

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end

यह यहाँ का एकमात्र वास्तविक उत्तर है। विदेशी कुंजी यहाँ सबसे महत्वपूर्ण हिस्सा है
user2490003

यह सही उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि प्रश्न रेल 3 के लिए पूछता है
कार्लोस रोके

35

आप एक परिवर्तन प्रवास में संदर्भों का उपयोग कर सकते हैं। यह मान्य रेल 3.2.13 कोड है:

class AddUserToTester < ActiveRecord::Migration
  def change
    change_table :testers do |t|
      t.references :user, index: true 
    end
  end
  def down
    change_table :testers do |t|
      t.remove :user_id
    end
  end
end

cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


1
परिवर्तन और नीचे तरीकों? इसके बजाय ऊपर और नीचे के तरीके नहीं हैं?
MaicolBen

@MaicolBen हाँ, और आप भी नीचे विधि को छोड़ सकते हैं।
Hut8

@MaicolBen downविधि के बिना , मुझे ActiveRecord::IrreversibleMigrationरेल 3.2 का उपयोग करके वापस रोल करना पड़ा। मैं भी परिवर्तन करना पड़ा changeकरने के लिए up
एंड्रयू ग्रिम

27

रनिंग rails g migration AddUserRefToSponsors user:referencesनिम्नलिखित माइग्रेशन उत्पन्न करेगा:

def change
  add_reference :sponsors, :user, index: true
end

रेल का कौन सा संस्करण इसके लिए है?
एंड्रयू ग्रिम

8

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

विदेशी कुंजी जोड़ने के लिए आपको user_id (कन्वेंशन) नाम के साथ एक पूर्णांक कॉलम बनाना होगा:

add_column :tester, :user_id, :integer

फिर परीक्षक मॉडल में एक מ_to जोड़ें:

class Tester < ActiveRecord::Base
  belongs_to :user
end

और आप विदेशी कुंजी के लिए एक इंडेक्स भी जोड़ना चाह सकते हैं (यह कुछ आपके लिए पहले से मौजूद संदर्भ है):

add_index :tester, :user_id

8

वह चाल चलेगा:

rails g migration add_user_to_tester user_id:integer:index

मुझे यह पसंद है कि यह सूचकांक को भी जोड़ता है जो आप सबसे अधिक चाहते हैं।
भीष्म

3

आप निम्न तरीके से कमांड लाइन के माध्यम से अपने मॉडल के संदर्भ जोड़ सकते हैं:

rails g migration add_column_to_tester user_id:integer

यह एक माइग्रेशन फ़ाइल उत्पन्न करेगा जैसे:

class AddColumnToTesters < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
  end
end

यह हर बार ठीक काम करता है जब मैं इसका उपयोग करता हूँ ।।


3

रेल के लिए ४

जनरेटर स्तंभ प्रकार को संदर्भ के रूप में स्वीकार करता है (जैसा भी उपलब्ध है belongs_to)।

यह माइग्रेशन एक user_idकॉलम और उपयुक्त इंडेक्स बनाएगा :

$ rails g migration AddUserRefToProducts user:references 

उत्पन्न करता है:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true
  end
end

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

रेल के लिए ३

हेल्पर को संदर्भ (जैसा भी उपलब्ध है belongs_to) कहा जाता है ।

यह माइग्रेशन category_idउपयुक्त प्रकार का एक कॉलम बनाएगा । ध्यान दें कि आप मॉडल नाम पास करते हैं, न कि कॉलम नाम। सक्रिय रिकॉर्ड _idआपके लिए जोड़ता है ।

change_table :products do |t|
  t.references :category
end

यदि आपके पास बहुरूपी belongs_toसंघ हैं, तो संदर्भ दोनों स्तंभों को जोड़ देंगे:

change_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

attachment_typeएक डिफ़ॉल्ट मान के साथ एक अनुलग्नक_आईडी स्तंभ और एक स्ट्रिंग स्तंभ जोड़ देगा Photo

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration

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