আপনি একটি কলামে validates
যাচাই করতে ব্যবহার করতে পারেন uniqueness
:
validates :user_id, uniqueness: {scope: :friend_id}
একাধিক কলামে বৈধতার জন্য বাক্য গঠন একই, তবে পরিবর্তে আপনাকে ক্ষেত্রগুলির একটি অ্যারে সরবরাহ করা উচিত:
validates :attr, uniqueness: {scope: [:attr1, ... , :attrn]}
তবে উপরে বর্ণিত বৈধতা পদ্ধতির রেসের শর্ত রয়েছে এবং ধারাবাহিকতা নিশ্চিত করতে পারে না। নিম্নলিখিত উদাহরণ বিবেচনা করুন:
ডাটাবেস সারণী রেকর্ডগুলি এন ক্ষেত্রগুলির দ্বারা স্বতন্ত্র বলে মনে করা হয় ;
একাধিক ( দুই বা ততোধিক ) একযোগে অনুরোধ, পৃথক প্রক্রিয়া দ্বারা পরিচালিত প্রতিটি ( অ্যাপ্লিকেশন সার্ভার, পটভূমি কর্মী সার্ভার বা আপনি যা ব্যবহার করছেন ), টেবিলে একই রেকর্ড সন্নিবেশ করতে ডাটাবেস অ্যাক্সেস করুন;
সমান্তরাল প্রতিটি প্রক্রিয়া যদি একই এন ক্ষেত্রের সাথে কোনও রেকর্ড থাকে তবে তা বৈধ হয় ;
প্রতিটি অনুরোধের বৈধতা সাফল্যের সাথে পাস করা হয় এবং প্রতিটি প্রক্রিয়া একই ডেটা সহ টেবিলে একটি রেকর্ড তৈরি করে।
এই জাতীয় আচরণ এড়াতে, ডিবি টেবিলে একটি অনন্য বাধা যুক্ত করা উচিত । আপনি add_index
নিম্নলিখিত মাইগ্রেশন চালিয়ে এক (বা একাধিক) ক্ষেত্র (গুলি) এর জন্য সহায়কের সাথে সেট করতে পারেন :
class AddUniqueConstraints < ActiveRecord::Migration
def change
add_index :table_name, [:field1, ... , :fieldn], unique: true
end
end
ক্যাভেট : আপনি একটি অনন্য বাধা নির্ধারণ করার পরেও, দু'একটি বা আরও বেশি যুগপত অনুরোধগুলি একই তথ্য ডিবিতে লেখার চেষ্টা করবে, তবে সদৃশ রেকর্ড তৈরি করার পরিবর্তে এটি একটি ActiveRecord::RecordNotUnique
ব্যতিক্রম বাড়াবে , যা আপনার আলাদাভাবে পরিচালনা করতে হবে:
begin
# writing to database
rescue ActiveRecord::RecordNotUnique => e
# handling the case when record already exists
end