रेल्स: कॉलम जोड़ने के बाद एक इंडेक्स जोड़ना


119

मान लीजिए मैंने tableएक रेल एप्लिकेशन में एक तालिका बनाई है । कुछ समय बाद, मैं एक स्तंभ जोड़ रहा हूँ:

rails generate migration AddUser_idColumnToTable user_id:string. 

तब मुझे एहसास हुआ कि मुझे user_idएक इंडेक्स के रूप में जोड़ना होगा । मुझे add_indexविधि के बारे में पता है , लेकिन इस विधि को कहां कहा जाना चाहिए? क्या मैं एक माइग्रेशन चलाने वाला हूँ (यदि हाँ, कौन सा?), तो इस विधि से हाथ जोड़कर?

जवाबों:


235

आप इंडेक्स के लिए एक और माइग्रेशन चला सकते हैं:

class AddIndexToTable < ActiveRecord::Migration
  def change
    add_index :table, :user_id
  end
end

4
तो मैं बस अपने कंसोल में चलता हूं: रेल माइग्रेशन AddIndexToTable उत्पन्न करते हैं?
user1611830

3
हां आप ऐसा कर सकते हैं, लेकिन आपको उपरोक्त कोड को प्रतिबिंबित करने के लिए उस माइग्रेशन को बाद में संपादित करना होगा।
जाप हागमंस

है: तालिका बहुवचन माना जाता है?
समाधि

1
@ टॉम ने मूल प्रश्न से उदाहरण का उपयोग किया। :tableवास्तविक तालिका नाम है, इसलिए तालिका के मामले में users, आप के :usersलिए स्थानापन्न करेंगे :table
जाप हागमैन

65

यदि आपको एक निर्माण करने की आवश्यकता है user_idतो यह एक उचित धारणा होगी कि आप एक उपयोगकर्ता तालिका का संदर्भ दे रहे हैं। किस स्थिति में प्रवास होगा:

rails generate migration AddUserRefToProducts user:references

यह आदेश निम्नलिखित माइग्रेशन उत्पन्न करेगा:

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

rake db:migrateएक user_idकॉलम और एक इंडेक्स दोनों चलाने के बाद productsटेबल पर एक इंडेक्स जोड़ा जाएगा ।

यदि आपको किसी मौजूदा कॉलम में एक इंडेक्स जोड़ने की जरूरत है, उदाहरण nameके userलिए, तालिका निम्न तकनीक सहायक हो सकती है:

rails generate migration AddIndexToUsers name:string:index निम्नलिखित माइग्रेशन उत्पन्न करेगा:

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_index :users, :name
  end
end

add_columnलाइन हटाएं और माइग्रेशन चलाएं।

वर्णित मामले में आप rails generate migration AddIndexIdToTable index_id:integer:indexआदेश जारी कर सकते हैं और फिर add_columnउत्पन्न माइग्रेशन से लाइन हटा सकते हैं । लेकिन मैंने प्रारंभिक माइग्रेशन को पूर्ववत करने और इसके बजाय संदर्भ जोड़ने की सिफारिश की है:

rails generate migration RemoveUserIdFromProducts user_id:integer
rails generate migration AddUserRefToProducts user:references

पूर्ण उत्तर के लिए धन्यवाद वादिम। एक आखिरी सवाल: आप प्रारंभिक माइग्रेशन को पूर्ववत करने की अनुशंसा क्यों करेंगे? क्या बाद में सूचकांक को जोड़ने से संबंधित कोई प्रदर्शन मुद्दा है?
फ्लेवियो वूनेश

2
@Fwuensche पर: बाद में सूचकांक जोड़ने के लिए कोई प्रदर्शन दंड नहीं है। डोमेन तर्क कम स्पष्ट होगा, हालांकि। उदाहरण के लिए, यदि आप बाद में एसोसिएशन को तोड़ने / अमूर्त / आदि करने का निर्णय लेते हैं, तो आपको दो अलग-अलग माइग्रेशन से निपटने की आवश्यकता होगी, जो वास्तव में एक ही होना चाहिए ...
Vadym Tyemirov

6
चेतावनी: ध्यान दें कि इंडेक्स: सच केवल create_table माइग्रेशन में काम करता है। माइग्रेशन चलेगा, लेकिन कोई इंडेक्स नहीं बनेगा। देखें makandracards.com/makandra/...
rmcsharry

9

कॉलम बनाने के बाद उत्पन्न माइग्रेशन में निम्नलिखित को जोड़ें (उदाहरण)

add_index :photographers, :email, :unique => true

आप इस तरह से कुछ मतलब है: स्वयं को जोड़ें। add_column ... अंत add_index ...?
14:16 बजे user1611830

5

संदर्भ के लिए आप कॉल कर सकते हैं

rails generate migration AddUserIdColumnToTable user:references

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

rails g migration AddOrdinationNumberToTable ordination_number:integer:index

जनरेट कोड:

class AddOrdinationNumberToTable < ActiveRecord::Migration
  def change
   add_column :tables, :ordination_number, :integer
   add_index :tables, :ordination_number, unique: true
  end
end

0

आप इसका उपयोग कर सकते हैं, बस यह सोचें कि जॉब उस मॉडल का नाम है जिसके साथ आप index Cader_id जोड़ रहे हैं :

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.