जवाबों:
add_index :people, [:firstname, :lastname, :dob], :unique => true
Howmanyofme.com के अनुसार, "अकेले संयुक्त राज्य अमेरिका में जॉन स्मिथ नाम के 46,427 लोग हैं"। यह लगभग 127 वर्षों का दिन है। जैसा कि यह एक इंसान के औसत जीवनकाल से अधिक है, इसका मतलब है कि एक डीओबी क्लैश गणितीय रूप से निश्चित है।
मैं केवल इतना कह रहा हूं कि अद्वितीय क्षेत्रों के विशेष संयोजन से भविष्य में अत्यधिक उपयोगकर्ता / ग्राहक हताशा हो सकती है।
यदि उचित हो, तो राष्ट्रीय पहचान संख्या की तरह कुछ विशिष्ट पर विचार करें।
(मुझे एहसास है कि मैं इस एक के साथ पार्टी में बहुत देर से जा रहा हूं, लेकिन यह भविष्य के पाठकों की मदद कर सकता है।)
आप एक सूचकांक के बिना एक बाधा जोड़ना चाहते हो सकता है। यह इस बात पर निर्भर करेगा कि आप किस डेटाबेस का उपयोग कर रहे हैं। नीचे Postgres के लिए नमूना माइग्रेशन कोड है। (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/9d641ca78dad8eb6473617363614d97ced
db/schema.rb
उत्पन्न: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a
पूर्णता के लिए, और भ्रम से बचने के लिए यहां एक ही काम करने के 3 तरीके हैं:
रेल नामकरण में स्तंभों के संयोजन के लिए एक अद्वितीय बाधा नाम जोड़ना 5.2+
मान लें कि हमारे पास स्थान तालिका है जो एक विज्ञापनदाता से संबंधित है और इसमें स्तंभ संदर्भ_कोड है और आप प्रति विज्ञापनदाता केवल 1 संदर्भ कोड चाहते हैं। इसलिए आप स्तंभों के संयोजन में एक अद्वितीय बाधा जोड़ना चाहते हैं और इसे नाम देते हैं।
करना:
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