रेल प्रवास: वैकल्पिक नाम के साथ t.references?


121

इसलिए मेरे पास एक स्कूल में पाठ्यक्रम के लिए एक create_table है:

create_table :courses do |t|
  t.string :name
  t.references :course
  t.timestamps
end

लेकिन मैं चाहता हूं कि यह दो अन्य पाठ्यक्रमों को संदर्भित करे :

has_many :transferrable_as # A Course
has_many :same_as          # Another Course

क्या मैं निम्नलिखित कह सकता हूँ?

t.references :transferrable_as, :as=> :course

जवाबों:


161

आप यह सब प्रारंभिक माइग्रेशन / कॉलम परिभाषा (कम से कम वर्तमान में रेल 5 में) कर सकते हैं:

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}

10
यह रेल 5.1 पर काम करता है और अन्य सुझावों में से कोई भी नहीं करता है। यह बहुत साफ है, और सही लगता है।
स्टीफनमुर्डोच

2
मैं रेल का उपयोग करता है 5.1.4 लेकिन यह काम नहीं करता है। जब मैं foreign_keyइस तरह से तालिका निर्माण में एक विकल्प निर्दिष्ट करता हूं , तो यह यह कहते हुए एक त्रुटि उठाता है कि मैं जो तालिका बना रहा हूं, वह मौजूद नहीं है ... इसलिए मुझे संदेह है कि यह वास्तव में आधिकारिक एपीआई द्वारा समर्थित नहीं है।
3

3
मैंने यह भी पढ़ा कि indexपहले से ही विदेशी कुंजी के रूप में जोड़ा जाता है Rails stackoverflow.com/questions/39769981/…
जोनाथन रेयेस

98

आप इसे इस तरह से कर सकते हैं:

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as
  t.references :same_as
  t.timestamps
end

या के t.belongs_toलिए एक उपनाम के रूप में उपयोग करt.references

आप foreign_key: trueउन दो संदर्भ लाइनों में जोड़ नहीं सकते । यदि आप उन्हें डेटाबेस स्तर पर विदेशी कुंजी के रूप में चिह्नित करना चाहते हैं, तो आपको इसके साथ माइग्रेशन की आवश्यकता होगी:

add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id

अपडेट करें

5.1 और इसके बाद के संस्करण में आप create_tableब्लॉक में माइग्रेशन में विदेशी कुंजी को इस तरह जोड़ सकते हैं :

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as, foreign_key: { to_table: 'courses' }
  t.references :same_as, foreign_key: { to_table: 'courses' }
  t.timestamps
end

5
foreign_key: trueसंदर्भ लाइनों को जोड़ने में सक्षम नहीं होने के बारे में वह हिस्सा था जो मुझे ऊपर ले जा रहा था। add_foreign_keyउन लोगों के लिए कॉलम नाम जोड़ने और निर्दिष्ट करने का काम किया।
मैथ्यू क्लार्क

क्या यह रेल में बॉक्स से बाहर काम करता है? के अनुसार stackoverflow.com/a/22384289/239657 , इस आवश्यकता schema_plusमणि। रेल के add_reference डॉक्स का उल्लेख नहीं है: संदर्भ विकल्प।
बेनी चेर्नियाव्स्की-पास्किन

1
मैं इस बात का पालन नहीं कर रहा हूं कि references:विकल्प क्या है (जैसा कि विरोध t.referencesनहीं किया गया है कि केवल मॉडल स्तर पर प्रासंगिक हो सकता है, विदेशी_के विचार से ध्यान रखा जा सकता है add_foreign_key?
एमसीबी

1
@MCB t.referencesकहता है "इस तालिका में एक फ़ील्ड जोड़ें जो किसी अन्य तालिका की प्राथमिक कुंजी है।" references:विकल्प यह बताता है जो तालिका इसके बारे में एक प्राथमिक कुंजी (की जरूरत है अगर यह क्षेत्र के नाम से स्पष्ट नहीं है) है। add_foreign_keyसमारोह से लागू रेफेरेंन्शिअल सत्यनिष्ठा यहाँ करने के लिए डेटाबेस में बताता है।
टॉबी 1 केनोबी

2
@MCB इस समय के बाद मुझे एहसास हुआ कि आप सभी सही थे। ऊपर आपकी पहली टिप्पणी बिल्कुल सही है - add_foreign_keyपंक्तियाँ डेटाबेस को यह बताने का ध्यान रखती हैं कि विदेशी कुंजी क्या है। references:पैरामीटर कुछ भी नहीं कर रही है।
टॉबी 1 केनोबी

13

मुझे लगता है कि इस धागे का एक और अधिक रेल-ईश रास्ता है: स्कैफोल्डिंग एक्टिवकार्ड: एक ही डेटा प्रकार के दो कॉलम

माइग्रेशन में:

t.belongs_to: transferrable_as

t.belongs_to: same_as


1
लेकिन db को कैसे पता चलता है कि टेबल से लिंक करने के लिए कौन सी विदेशी कुंजी है? मैं Postgres डेटाबेस के साथ यह कोशिश कर रहा हूं और यह मुझे एक त्रुटि दे रहा है जो PG::UndefinedTable: ERRORएक विदेशी कुंजी बाधा को एक तालिका में जोड़ने की कोशिश कर रहा है जो मौजूद नहीं है।
टॉबी 1 केनोबी

यदि कोई सोच रहा है, belongs_toतो बस एक अन्य के लिए एक उपनाम है referencesऔर इसकी समान कार्यक्षमता है।
जेसन स्विट

11

इस प्रश्न के अतिरिक्त उत्तर के रूप में - मॉडल में एसोसिएशन को पूरा करने के लिए निम्नलिखित पंक्ति होनी चाहिए:

    belongs_to :transferrable_as, class_name: "Course"
    belongs_to :same_as, class_name: "Course"

3

मुझे नहीं लगता referencesकि :asविकल्प स्वीकार करता है , लेकिन आप अपने कॉलम मैन्युअल रूप से बना सकते हैं ...

create_table :courses do |t| 
  t.string  :name 
  t.integer :course1_id
  t.integer :course2_id 
  t.timestamps 
end 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.