উত্তর:
add_index :people, [:firstname, :lastname, :dob], :unique => true
হাওম্যানিওফমে ডটকমের তথ্য অনুসারে, শুধুমাত্র যুক্তরাষ্ট্রে "জন স্মিথ নামে 46,427 জন লোক রয়েছে"। এটি প্রায় 127 বছর দিন। যেহেতু এটি একটি মানুষের গড় জীবনকালকে ভালভাবে বোঝায়, এর অর্থ একটি ডিওবি সংঘর্ষ গণিতগতভাবে নিশ্চিত।
আমি যা বলছি তা হ'ল সেই অনন্য ক্ষেত্রগুলির নির্দিষ্ট মিশ্রণটি ভবিষ্যতে চরম ব্যবহারকারী / গ্রাহকের হতাশার দিকে পরিচালিত করতে পারে।
যথাযথভাবে জাতীয় পরিচয় সংখ্যা হিসাবে, এমনটি যা অনন্য তা বিবেচনা করুন।
(আমি বুঝতে পারি যে এই একটি নিয়ে আমি পার্টিতে খুব দেরি করেছি, তবে এটি ভবিষ্যতের পাঠকদের সহায়তা করতে পারে))
আপনি কোনও সূচি ছাড়াই বাধা যুক্ত করতে চাইতে পারেন want আপনি কোন ডাটাবেস ব্যবহার করছেন তার উপর এটি নির্ভর করবে। নীচে পোস্টগ্রিসের জন্য নমুনা স্থানান্তর কোড রয়েছে। (tracking_number, carrier)
সীমাবদ্ধতার জন্য আপনি যে কলামগুলি ব্যবহার করতে চান তার একটি তালিকা।
class AddUniqeConstraintToShipments < ActiveRecord::Migration
def up
execute <<-SQL
alter table shipments
add constraint shipment_tracking_number unique (tracking_number, carrier);
SQL
end
def down
execute <<-SQL
alter table shipments
drop constraint if exists shipment_tracking_number;
SQL
end
end
আপনি যুক্ত করতে পারেন বিভিন্ন বাধা আছে। দস্তাবেজগুলি পড়ুন
add_index
পদ্ধতিটি ব্যবহারের মতো হবে । ;)
হাই আপনি উদাহরণস্বরূপ কলামগুলিতে আপনার মাইগ্রেশনে অনন্য সূচক যুক্ত করতে পারেন
add_index(:accounts, [:branch_id, :party_id], :unique => true)
বা প্রতিটি কলামের জন্য পৃথক অনন্য সূচী
ব্যবহারকারী এবং পোস্টগুলির মধ্যে যোগদানের টেবিলের সাধারণ উদাহরণে:
create_table :users
create_table :posts
create_table :ownerships do |t|
t.belongs_to :user, foreign_key: true, null: false
t.belongs_to :post, foreign_key: true, null: false
end
add_index :ownerships, [:user_id, :post_id], unique: true
দুটি অনুরূপ রেকর্ড তৈরি করার চেষ্টা করা একটি ডাটাবেস ত্রুটি নিক্ষেপ করবে (আমার ক্ষেত্রে পোস্টগ্রিস):
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_ownerships_on_user_id_and_post_id"
DETAIL: Key (user_id, post_id)=(1, 1) already exists.
: INSERT INTO "ownerships" ("user_id", "post_id") VALUES ($1, $2) RETURNING "id"
যেমন:
Ownership.create!(user_id: user_id, post_id: post_id)
Ownership.create!(user_id: user_id, post_id: post_id)
পুরোপুরি চলমান উদাহরণ: https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced
db/schema.rb
উত্পন্ন: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a
সম্পূর্ণতার জন্য এবং বিভ্রান্তি এড়াতে এখানে একই জিনিস করার 3 টি উপায়:
রেল 5.2+ এ কলামগুলির সংমিশ্রণে একটি নামযুক্ত অনন্য সীমাবদ্ধতা যুক্ত করা
ধরা যাক আমাদের কাছে অবস্থানের টেবিল রয়েছে যা কোনও বিজ্ঞাপনদাতার অন্তর্ভুক্ত এবং কলাম রেফারেন্স_ কোড রয়েছে এবং আপনি বিজ্ঞাপনদাতাকে কেবল 1 রেফারেন্স কোড চান code সুতরাং আপনি কলামগুলির সংমিশ্রণে একটি অনন্য বাধা যুক্ত করতে এবং এটির নাম রাখতে চান।
না:
rails g migration AddUniquenessConstraintToLocations
এবং আপনার মাইগ্রেশনটিকে এই লাইনারের মতো কিছু দেখায়:
class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
def change
add_index :locations, [:reference_code, :advertiser_id], unique: true, name: 'uniq_reference_code_per_advertiser'
end
end
বা এই ব্লক সংস্করণ।
class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
def change
change_table :locations do |t|
t.index ['reference_code', 'advertiser_id'], name: 'uniq_reference_code_per_advertiser', unique: true
end
end
end
অথবা এই কাঁচা এসকিউএল সংস্করণ
class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
def change
execute <<-SQL
ALTER TABLE locations
ADD CONSTRAINT uniq_reference_code_per_advertiser UNIQUE (reference_code, advertiser_id);
SQL
end
end
এর যে কোনওটির একই ফল হবে, আপনার পরীক্ষা করুন schema.rb