রেলস: কলাম যুক্ত করার পরে একটি সূচক যুক্ত করা হচ্ছে


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
সুতরাং আমি কেবল আমার কনসোলটিতে চালাচ্ছি: রেলগুলি মাইগ্রেশন অ্যাডইন্ডেক্সটোটেবল উত্পন্ন করে?
ব্যবহারকারী 1611830

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

সম্পূর্ণ উত্তরের জন্য ভডিয়াম ধন্যবাদ Thanks একটি শেষ প্রশ্ন: আপনি কেন প্রাথমিক মাইগ্রেশনটি পূর্বাবস্থায় ফেলার সুপারিশ করবেন? সূচি যোগ করার পরে কি কোনও পারফরম্যান্স সমস্যা আছে?
ফ্ল্যাভিও ওউনশে

2
@Fwuensche- কে: পরে সূচক যুক্ত করার জন্য কোনও পারফরম্যান্স পেনাল্টি নেই। যদিও ডোমেন যুক্তি কম স্পষ্ট হবে। উদাহরণস্বরূপ, আপনি যদি পরবর্তীকালে এই
সমিতিটি

5
সতর্কতা: নোট করুন যে সূচক: সত্যটি শুধুমাত্র একটি ক্রিয়েটিটেবল মাইগ্রেশনে কাজ করে। মাইগ্রেশন চলবে, তবে কোনও সূচক তৈরি হবে না। Makandracards.com/makandra/…
rmcsharry

9

নিম্নলিখিতটি কলাম তৈরি করার পরে উত্পন্ন মাইগ্রেশনে যুক্ত করুন (উদাহরণস্বরূপ)

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

আপনি এর অর্থ কিছু বোঝাতে চাইছেন: ডিফ সেল্ফ.আপ অ্যাড_ক্লোনম ... শেষ অ্যাড_ইন্ডেক্স ...?
ব্যবহারকারী 1611830

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

আপনি এটি ব্যবহার করতে পারেন, কেবল ভাবেন যে আপনি সেই মডেলটির নাম যা আপনি সূচক ক্যাডার_আইড যুক্ত করছেন :

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.