[Ruby-on-rails] रेल 3 माइग्रेशन: संदर्भ कॉलम जोड़ना?


Answers

संपादित करें : यह पुराना उत्तर है और रेल 4.x + के लिए आवेदन नहीं किया जाना चाहिए

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

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

तो मैं इसके बजाय ऐसा करूंगा:

rails g migration add_user_id_to_tester user_id:integer

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

Question

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

rails g migration tester title:tester user:references

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

rails g migration add_user_to_tester user:references

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




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

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



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

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



रेल 4 के लिए

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

यह माइग्रेशन उपयोगकर्ता_आईडी कॉलम और उचित अनुक्रमणिका बनाएगा:

$ 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

रेल 3 के लिए

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

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

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

यदि आपके पास polymorphic संघों से संबंधित है तो संदर्भ दोनों कॉलम आवश्यक होंगे:

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

Photo डिफ़ॉल्ट मान के साथ एक attachment_id कॉलम और एक स्ट्रिंग attachment_type कॉलम जोड़ देगा।

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




वह चाल करेगा:

rails g migration add_user_to_tester user_id:integer:index