संदर्भ पॉलीमॉर्फिक बनाने के लिए माइग्रेशन कैसे उत्पन्न करें


121

मेरे पास एक उत्पाद तालिका है और एक कॉलम जोड़ना चाहते हैं:

t.references :imageable, :polymorphic => true

मैं इसके लिए प्रवासन उत्पन्न करने की कोशिश कर रहा था:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

लेकिन मैं स्पष्ट रूप से गलत कर रहा हूँ। क्या कोई कोई सुझाव दे सकता है? धन्यवाद

जब मैंने माइग्रेशन उत्पन्न करने के बाद इसे मैन्युअल रूप से डालने का प्रयास किया, तो मैंने इसे इस तरह किया:

class AddImageableToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :imageable, :references, :polymorphic => true
  end

  def self.down
    remove_column :products, :imageable
  end
end

और यह अभी भी काम नहीं किया है


उत्तर नहीं, लेकिन भ्रम से बचने के लिए, क्या आप सुनिश्चित हैं कि आप उत्पादों पर यह कॉलम चाहते हैं? रेल गाइड में एक उत्पाद उदाहरण भी है और स्तंभ चित्र गाइड
atomkirk

जवाबों:


109

जहां तक ​​मुझे पता है, पॉलिमॉर्फिक एसोसिएशन के लिए कोई बिल्ट-इन जनरेटर नहीं है। एक रिक्त माइग्रेशन उत्पन्न करें और फिर इसे अपनी आवश्यकताओं के अनुसार हाथ से संशोधित करें।

अपडेट : आपको यह निर्दिष्ट करना होगा कि आप किस तालिका को बदल रहे हैं। इस SO उत्तर के अनुसार :

class AddImageableToProducts < ActiveRecord::Migration
  def up
    change_table :products do |t|
      t.references :imageable, polymorphic: true
    end
  end

  def down
    change_table :products do |t|
      t.remove_references :imageable, polymorphic: true
    end
  end
end

बहुत बहुत धन्यवाद ब्रैंडन। मैं माइग्रेशन चलाने में सक्षम था। मैं सोच रहा था, हालांकि आप बनाने के बाद: बहुरूपी => सच है और आप स्कीमा खोलते हैं। क्या आप इसे स्कीमा में भी देखने वाले हैं?
रेल्सलेरर

आपके द्वारा माइग्रेशन चलाने के बाद, schema.rbउसे अपडेट किया जाना चाहिए, लेकिन यह कुछ भी नहीं कहेगा polymorphic। इसके बजाय, आपको उन वास्तविक फ़ील्ड्स को देखना चाहिए जिनका उपयोग रेल करता है ( रेल गाइड के पास अधिक जानकारी है)।
मिशेल टाइली

2
आप referencesकॉलम में इंडेक्स कैसे जोड़ते हैं ? क्या मुझे उसे इंडेक्स करने की आवश्यकता है?
मृदुल

@ मृदुल अगर मैं गलत नहीं हूँ, तो आपको ज़रूरत पड़ने पर उन्हें खुद से जोड़ने की ज़रूरत है। आप माइग्रेशन फ़ाइल में सामान्य रूप से अनुक्रमित जोड़ सकते हैं imageable_typeऔर / या imageable_idआवश्यकतानुसार कर सकते हैं।
मिशेल टिली

2
हाँ। सूचकांक को जोड़ने imageable_idऔर imageable_typeकाम किया। आपकी सहायता के लिए धन्यवाद।
मृदुल

266

आप जो करने की कोशिश कर रहे हैं वह अभी तक रेल के स्थिर संस्करण में लागू नहीं किया गया है इसलिए मिशेल का जवाब अभी के लिए सही है। लेकिन इस सुविधा को रेल 4 में लागू किया जाएगा और यह पहले से ही किनारे संस्करण में उपलब्ध है (इस चैनल के अनुसार ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
इस पर 4.2 की कोशिश की, और मुझे यकीन नहीं है कि यह एक बग, zsh, या कुछ और है, लेकिन कमांडलाइन को पॉलिमॉर्फिक के प्रत्येक अक्षर के साथ संदर्भों (प्रकारों) की एक श्रृंखला के रूप में व्याख्या की गई थी, जैसे: t.referencesp: कल्पनीय , treferenceso: कल्पनीय, आदि
OzBarry

10
@OzBarry, zsh में आपको ब्रेसिज़ से बचने की आवश्यकता होगी: $ रेलें माइग्रेशन उत्पन्न करती हैं AddImageableToProducts कल्पना करने योग्य: संदर्भ \ {
बहुरूपिक

4
जिज्ञासु के लिए, यह परिवर्तन पद्धति के साथ एक प्रवास उत्पन्न करता है:add_reference :products, :imageable, polymorphic: true, index: true
स्टीवंसपिल

1
किसी को भी मचान में उपयोग करने का प्रयास करें, यह मचान के साथ भी काम करता है। धन्यवाद! रिक्स
sghosh968

2
{polymorphic}मछली के खोल के साथ भाग जाने की जरूरत है, जैसे\{polymorphic\}
डोरियन

36

आप निम्न कार्य भी कर सकते हैं:

class AddImageableToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :imageable, polymorphic: true, index: true
  end
end

16

तुम कोशिश कर सकते हो rails generate migration AddImageableToProducts imageable:references{polymorphic}


3
{और }कम से कम मछली के खोल के साथ भाग जाने की आवश्यकता है, जैसे\{polymorphic\}
डोरियन

1
यहाँ इस बारे में प्रलेखन का लिंक दिया गया है: edgeguides.rubyonrails.org/…
Giovanni Benussi

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