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


310

एक उपयोगकर्ता के कई अपलोड हैं। मैं uploadsतालिका का एक कॉलम जोड़ना चाहता हूं जो संदर्भ देता है user। माइग्रेशन कैसा दिखना चाहिए?

यही सब कुछ मेरे पास है। मुझे यकीन नहीं है कि मुझे (1) :user_id, :intया (2) का उपयोग करना चाहिए :user, :references। मुझे यकीन नहीं है कि अगर (2) काम करता है। बस इसे "रेल" तरीके से करने की कोशिश कर रहा है।

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

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

जवाबों:


706

रेल 4.x

आप जब पहले से ही है users और uploadsटेबल और करना चाहते हैं एक नए संबंध जोड़ने उन दोनों के बीच।

आपको बस इतना करना है: निम्नलिखित कमांड का उपयोग करके एक माइग्रेशन उत्पन्न करें:

rails g migration AddUserToUploads user:references

जो एक माइग्रेशन फ़ाइल बनाएगा:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
  end
end

फिर, उपयोग करके माइग्रेशन चलाएं rake db:migrate। इस माइग्रेशन में टेबल नाम user_idका एक नया कॉलम जोड़ने का ख्याल रखा जाएगा uploads(टेबल में संदर्भित idकॉलम users), इसके अलावा नए कॉलम में एक इंडेक्स भी जोड़ा जाएगा।

अद्यतन [रेल 4.2 के लिए]

संदर्भात्मक अखंडता को बनाए रखने के लिए रेल पर भरोसा नहीं किया जा सकता है; संबंधपरक डेटाबेस यहाँ हमारे बचाव में आते हैं। इसका मतलब यह है कि हम डेटाबेस स्तर पर विदेशी प्रमुख बाधाओं को जोड़ सकते हैं और यह सुनिश्चित कर सकते हैं कि डेटाबेस इस सेट को संदर्भित अखंडता का उल्लंघन करने वाले किसी भी ऑपरेशन को अस्वीकार कर देगा। जैसा कि @infoget ने टिप्पणी की, विदेशी कुंजियों (संदर्भात्मक अखंडता) के लिए देशी समर्थन के साथ 4.2 जहाजों की संख्या । यह आवश्यक नहीं है, लेकिन आप विदेशी कुंजी जोड़ना चाहते हैं (क्योंकि यह बहुत उपयोगी है) जो हमने ऊपर बनाया है।

मौजूदा संदर्भ में विदेशी कुंजी जोड़ने के लिए, विदेशी कुंजी जोड़ने के लिए एक नया माइग्रेशन बनाएं:

class AddForeignKeyToUploads < ActiveRecord::Migration
  def change
    add_foreign_key :uploads, :users
  end
end

एक विदेशी कुंजी (रेल 4.2 में) के साथ पूरी तरह से नया संदर्भ बनाने के लिए , निम्नलिखित कमांड का उपयोग करके माइग्रेशन उत्पन्न करें:

rails g migration AddUserToUploads user:references

जो एक माइग्रेशन फ़ाइल बनाएगा:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
    add_foreign_key :uploads, :users
  end
end

यह तालिका के user_idस्तंभ में एक नई विदेशी कुंजी जोड़ देगा uploads। कुंजी तालिका idमें कॉलम को संदर्भित करती है users

नोट: यह एक संदर्भ जोड़ने के अलावा है, इसलिए आपको अभी भी पहले एक संदर्भ बनाने की आवश्यकता है फिर विदेशी कुंजी ( आप एक ही माइग्रेशन या एक अलग प्रवास फ़ाइल में एक विदेशी कुंजी बनाने के लिए चुन सकते हैं )। सक्रिय रिकॉर्ड केवल एकल स्तंभ विदेशी कुंजी का समर्थन करता है और वर्तमान में केवल mysql, mysql2और PostgreSQLएडेप्टर समर्थित हैं। इस तरह के अन्य एडेप्टर के साथ कोशिश मत करो sqlite3, आदि। पटरियों का संदर्भ लें : आपके संदर्भ के लिए विदेशी कुंजी


8
कई मामलों में विदेशी कुंजी को भी जोड़ना अच्छा है। add_foreign_key (रेल्स 4.2)
कविवर

18
मेरा मानना ​​है कि आप एक पंक्ति में सभी कर सकते हैं: add_reference: अपलोड,: उपयोगकर्ता, सूचकांक: सच, विदेशी_की: सच @KirtiThorat
user1801879

32
अब, यदि आप माइग्रेशन के लिए विशेष जनरेटर सिंटैक्स का उपयोग करते हैं, तो रेल्स 4.2 विदेशी कुंजी बाधाओं के साथ स्वचालित रूप से सही माइग्रेशन बनाएगा। उचित प्रवास में rails g migration AddUserToUploads user:referencesउत्पादन करता add_reference :uploads, :user, index: true, foreign_key: trueहै।
jhhorn424

10
...index: true, foreign_key: trueइसके बजाय ओ लाइन का उपयोग करें add_foreign_key
वाशिंगटन Botelho

2
हम क्यों की जरूरत है दोनों करते हैं foreign_keyऔर t.reference? t.referenceअनिवार्य रूप से foriegn_key+ के बराबर नहीं है index?
जियोबॉय

187

रेलें ५

माइग्रेशन बनाने के लिए आप अभी भी इस कमांड का उपयोग कर सकते हैं:

rails g migration AddUserToUploads user:references

माइग्रेशन पहले की तुलना में थोड़ा अलग दिखता है, लेकिन फिर भी काम करता है:

class AddUserToUploads < ActiveRecord::Migration[5.0]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

ध्यान दें कि यह :userनहीं है:user_id


2
नाम से स्थान दिया गया कक्षाएं, जैसे के लिए Local::Userके बजाय Userपसंद है कुछ rails g migration AddLocalUserToUploads user:references
का मोक

3
क्या यह स्वचालित रूप से जोड़ देता है:index
सर्वनाबलगी रामचंद्रन

4
@ ज़ेके हाँ, माइग्रेशन चलाएं और अपने स्कीमा की जांच करें, इसे कुछ इस तरह कहना चाहिएt.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
मिरर318

1
हाँ, मुझे एक "इंडेक्स मौजूद है" त्रुटि तब मिली जब मैंने मैन्युअल रूप से add_index को माइग्रेशन में जोड़ा: P @ Mirror318
Saravanabalagi Ramachandran

2
हमें कक्षा belongs_to :userमें भी जोड़ना चाहिए Upload, इसलिए हम upload.userउपयोगकर्ता का उदाहरण प्राप्त करने के लिए उपयोग कर सकते हैं ।
बुद्धि

17

यदि आप के साथ एक और वैकल्पिक दृष्टिकोण की तरह upऔर downविधि इस प्रयास करें:

  def up
    change_table :uploads do |t|
      t.references :user, index: true
    end
  end

  def down
    change_table :uploads do |t|
      t.remove_references :user, index: true
    end
  end

9

[रेल का उपयोग 5]

माइग्रेशन जनरेट करें:

rails generate migration add_user_reference_to_uploads user:references

यह माइग्रेशन फ़ाइल बनाएगा:

class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

अब यदि आप स्कीमा फ़ाइल का निरीक्षण करते हैं, तो आप देखेंगे कि अपलोड तालिका में एक नया फ़ील्ड है। कुछ इस तरह: t.bigint "user_id"या t.integer "user_id"

डेटाबेस माइग्रेट करें:

rails db:migrate

1
यह उत्तर @ Mirror318 के उत्तर का डुप्लिकेट प्रतीत होता है। कृपया उपरोक्त उत्तर पर टिप्पणी करें यदि आपको लगता है कि कुछ इससे गायब है। धन्यवाद।
एम। हबीब


7

अगर किसी को एक ही समस्या है तो बस दस्तावेज ...

मेरी स्थिति में मैं :uuidखेतों का उपयोग कर रहा हूं , और उपरोक्त उत्तर मेरे मामले में काम नहीं करते हैं, क्योंकि रेल 5 :bigintइसके बजाय एक स्तंभ बना रहे हैं :uuid:

add_column :uploads, :user_id, :uuid
add_index :uploads, :user_id
add_foreign_key :uploads, :users

यह भी बहुत स्पष्ट है कि क्या हो रहा है। लेकिन हाँ UUID अब मानक होना चाहिए।
19

2

एक माइग्रेशन फ़ाइल बनाएँ

rails generate migration add_references_to_uploads user:references

डिफ़ॉल्ट विदेशी कुंजी नाम

यह एक विदेशी कुंजी के रूप में अपलोड तालिका में एक user_id कॉलम बनाएगा

class AddReferencesToUploads < ActiveRecord::Migration[5.2]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

उपयोगकर्ता मॉडल:

class User < ApplicationRecord
  has_many :uploads
end

अपलोड मॉडल:

class Upload < ApplicationRecord
  belongs_to :user
end

विदेशी कुंजी नाम अनुकूलित करें:

add_reference :uploads, :author, references: :user, foreign_key: true

यह विदेशी कुंजी के रूप में अपलोड तालिकाओं में एक author_id कॉलम बनाएगा।

उपयोगकर्ता मॉडल:

class User < ApplicationRecord
  has_many :uploads, foreign_key: 'author_id'
end

अपलोड मॉडल:

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