আমি কীভাবে একটি কলামকে অনন্য করে তুলতে পারি এবং এটি রেলের অনন্য স্থানান্তরের রুবিতে সূচি করব?


416

আমি uniqueরুবে অন রেল মাইগ্রেশন স্ক্রিপ্টে একটি কলাম তৈরি করতে চাই । এটা করার সবচেয়ে ভালো উপায় কি? এছাড়াও কোনও টেবিলে কোনও কলামকে সূচি দেওয়ার উপায় আছে?

আমি uniqueকেবলমাত্র ব্যবহারের বিপরীতে একটি ডাটাবেসে কলাম প্রয়োগ করতে চাই :validate_uniqueness_of

উত্তর:


686

রেলের পুরানো সংস্করণগুলির সংক্ষিপ্ত উত্তর (রেল 4+ এর জন্য অন্যান্য উত্তর দেখুন):

add_index :table_name, :column_name, unique: true

একাধিক কলাম একসাথে সূচি করতে, আপনি একক কলামের নামের পরিবর্তে কলামের নামের একটি অ্যারে পাস করেন,

add_index :table_name, [:column_name_a, :column_name_b], unique: true

আপনি যদি "সূচকের নাম ... খুব দীর্ঘ" name: "whatever"পেয়ে থাকেন তবে নামটি সংক্ষিপ্ত করে তুলতে আপনি add_index পদ্ধতিতে যুক্ত করতে পারেন।

জরিমানাযুক্ত নিয়ন্ত্রণের জন্য, " execute" একটি পদ্ধতি আছে যা সরাসরি এসকিউএল চালায়।

এটাই!

আপনি যদি নিয়মিত পুরানো মডেল বৈধতার জন্য প্রতিস্থাপন হিসাবে এটি করছেন, এটি কীভাবে কাজ করে তা পরীক্ষা করে দেখুন। ব্যবহারকারীর কাছে ত্রুটি জানানো সম্ভবত মডেল-স্তরের বৈধতা ছাড়াই দুর্দান্ত হবে না। আপনি সর্বদা উভয় করতে পারেন।


36
+1 বৈধতা_অযুক্তি_সামগ্রী ব্যবহার করা চালিয়ে যাওয়ার পরামর্শ দেওয়ার জন্য। একক ইনডেক্সড ক্যোয়ারির ব্যয়ের জন্য এই পদ্ধতিটি ব্যবহার করে ত্রুটি পরিচালনার বিষয়টি অনেক বেশি পরিচ্ছন্ন suggest আমি পরামর্শ দিচ্ছি যে সে উভয়ই করেছে
স্টিভ ওয়েট

1
আমি চেষ্টা করেছি যে এটি কাজ করে না বলে মনে হচ্ছে! আমি স্বতন্ত্র হিসাবে সংজ্ঞায়িত কলাম_নাম দিয়ে দুটি রেকর্ড সন্নিবেশ করতে পারলাম! আমি রেলগুলি 2.3.4 এবং মাইএসকিউএল কোনও ধারণা ব্যবহার করছি?
ট্যাম

আমি এক্সিকিউট ব্যবহার করে আপনার দ্বিতীয় পরামর্শটি ব্যবহার করেছি: "অল্টার টেবিল ব্যবহারকারীদের অনন্য (ইমেল) যুক্ত করুন" কার্যকর করুন এবং এটি কার্যকর! নিশ্চিত না কেন প্রথমটি কেন জানতে আগ্রহী হবে না
টেম্প

1
indexed columns are not uniqueকোনও অনন্য সূচক তৈরি করার চেষ্টা করার সময় আপনি যদি ত্রুটি পান তবে এটি হতে পারে কারণ টেবিলের ডেটাতে ইতিমধ্যে নকল রয়েছে। সদৃশ ডেটা সরিয়ে আবার মাইগ্রেশন চালানোর চেষ্টা করুন।
হার্টলে ব্রডি

5
আপনি যদি "সূচকের নাম ... খুব দীর্ঘ" পেয়ে থাকেন তবে নামটি খাটো , :name => "whatever"করার add_indexপদ্ধতিতে আপনি যুক্ত করতে পারেন।
রিক স্মিথ

129

রেলগুলি মাইগ্রেশন যুক্ত করে_ইনডেক্স_ থেকে_ টেবিল_নাম কলাম_নাম: ইউনিক

অথবা

রেলগুলি মাইগ্রেশন সংযোজন_সারণক_নাম_ত_ টেবিল_নাম কলাম_নাম: স্ট্রিং: ইউনিক: সূচক

উত্পন্ন

class AddIndexToModerators < ActiveRecord::Migration
  def change
    add_column :moderators, :username, :string
    add_index :moderators, :username, unique: true
  end
end

আপনি যদি বিদ্যমান কলামে একটি সূচক যুক্ত করে থাকেন তবে add_columnলাইনটি সরিয়ে ফেলুন বা মন্তব্য করুন বা একটি পরীক্ষা করুন

add_column :moderators, :username, :string unless column_exists? :moderators, :username

5
আমি এটি উন্নীত করেছি কারণ আমি কমান্ড লাইন ফর্ম চেয়েছিলাম। তবে এটি নির্বোধ যে এটি কলামটি যুক্ত করে এমনকি আমি উল্লেখ করেছি add_index...এবং না করি add_column...
টাইলার কলিয়ার

1
ইয়াপ, সম্ভবত পরবর্তী সংস্করণে।
d.danailov

49

যেহেতু এই এখনো উল্লেখ করা হয় নি কিন্তু প্রশ্ন ছিল আমি যখন আমি এই পৃষ্ঠা খুঁজে পাওয়া উত্তর, এছাড়াও আপনি নির্দিষ্ট করতে পারেন যে একটি সূচক অনন্য যখন মাধ্যমে এটি যোগ হওয়া উচিত t.referencesবা t.belongs_to:

create_table :accounts do |t|
  t.references :user, index: { unique: true } # or t.belongs_to

  # other columns...
end

(কমপক্ষে রেল হিসাবে 4.2.7)


42

আপনি যদি একটি নতুন টেবিল তৈরি করে থাকেন তবে আপনি ইনলাইন শর্টকাটটি ব্যবহার করতে পারেন:

  def change
    create_table :posts do |t|
      t.string :title, null: false, index: { unique: true }
      t.timestamps
    end
  end

14

আমি রেল 5 ব্যবহার করছি এবং উপরের উত্তরগুলি দুর্দান্ত কাজ করছে; এখানে অন্য উপায় যা আমার পক্ষেও কাজ করেছিল (টেবিলের নাম :peopleএবং কলামের নাম :email_address)

class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
  def change
    change_table :people do |t|
      t.index :email_address, unique: true
    end
  end
end

1

আপনি অনন্য কীটির জন্য নাম যুক্ত করতে চাইতে পারেন কারণ রেল দ্বারা ডিফল্ট অনন্য_কির নামটি অনেক দীর্ঘ হতে পারে যার জন্য ডিবি ত্রুটিটি ফেলে দিতে পারে।

আপনার সূচকের নাম যুক্ত করতে কেবল name:বিকল্পটি ব্যবহার করুন । মাইগ্রেশন ক্যোয়ারী এর মতো দেখতে পারে -

add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'

আরও তথ্য - http://apidock.com/rails/ActtiveRecord/ConnicationAdapters/SchemaStatements/add_index


1
add_index :table_name, :column_name, unique: true

একসাথে একাধিক কলামকে সূচী করতে, আপনি একক কলামের পরিবর্তে কলামের নামের একটি অ্যারে পাস করেন।


0

আপনি যদি ডিবি কলামে অনন্য যোগ করতে না ভুলে থাকেন তবে ক্ষেত্রটি অনন্য কিনা তা পরীক্ষা করতে মডেলটিতে এই বৈধতাটি যুক্ত করুন:

class Person < ActiveRecord::Base
  validates_uniqueness_of :user_name
end

এখানে পড়ুন সর্বোপরি শুধুমাত্র উদ্দেশ্যে পরীক্ষার জন্য, যোগ করুন দয়া করে সূচক পরিবর্তন ডিবি কলাম হিসেবে @Nate দ্বারা প্রস্তাবিত

আরও তথ্যের জন্য অনুগ্রহ করে এটি সূচক সহ উল্লেখ করুন


2
আমি কোনও সংশ্লিষ্ট সূচক ছাড়া কেবল বৈধতা যুক্ত করার পরামর্শ দেব না। আরও ভাল বিকল্পটি হ'ল যে কোনও বিদ্যমান নকল পরিষ্কার করা এবং তারপরে সূচক যুক্ত করা। অন্যথায় আপনি বিদ্যমান ডেটা অকার্যকর হওয়ার ঝুঁকি নিয়েছেন (যার ফলে এই সারিগুলিতে কোনও আপডেট ব্যর্থ হতে পারে), এবং আপনার এখনও যদি ডুপ্লিকেটগুলি দিয়ে শেষ করতে পারে তবে রেলের বৈধতাগুলি এড়ানোর কোনও কোড রয়েছে। (উদাঃ, আপডেট_এল চালানোর সময়, বা সরাসরি এসকিউএল সন্নিবেশ
নট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.