একাধিক কলামের স্বতন্ত্রতা বৈধতা দিন


193

সত্যিকারের রেকর্ডটি অনন্য এবং কেবল একটি কলাম নয় তা যাচাই করার জন্য কি রেল-ওয়ে উপায় আছে? উদাহরণস্বরূপ, একটি বন্ধুত্বের মডেল / টেবিলের মতো একাধিক অভিন্ন রেকর্ড রাখতে সক্ষম হওয়া উচিত নয়:

user_id: 10 | friend_id: 20
user_id: 10 | friend_id: 20

7
যদি আমি ঘন হয়ে থাকি তবে আমাকে ক্ষমা করুন, তবে কীভাবে এই পরিস্থিতিতে সহায়তা করবে?
2'11

2
আপনার মডেলটিতে "বৈধতা_সামান্যতা" ব্যবহার করে দেখুন। যদি এটি এমন একটি সূচক তৈরির চেষ্টা করে না যা আপনি ফিডসগুলির একটি মাইগ্রেশন তৈরি করতে পারেন যার মধ্যে অ্যাড_ইন্ডেক্স: টেবিল, [: কলাম_এ,: কলাম_বি],: অনন্য => সত্য)
হ্যারি জয়

1
@ হারিজয়, তিনি জিজ্ঞাসা করেছেন Is there a rails-way way। এবং আপনি তাকে অ-রেলপথের প্রস্তাব দিচ্ছেন, তবে মানক। The Active Record way claims that intelligence belongs in your models, not in the database.
সবুজ

2
দুর্ভাগ্যক্রমে validates :field_name, unique: trueজাতিগত অবস্থার ঝুঁকিপূর্ণ, সুতরাং রেলপথের বিরুদ্ধে হলেও, একটি প্রকৃত বাধা অগ্রাধিকার পায়। @ হ্যারিজয় আমি সীমাবদ্ধতার উপায় বর্ণনা করে একটি উত্তর উপস্থাপন করব।
পুয়ান খোসরাভি

1
আরও ভাল উত্তর তারপর নীচের সমস্ত উল্লিখিত এটি হ'ল এটি একটি স্ট্যাকওভারফ্লো.com/a/34425284/1612469 কারণ এটি সঠিকভাবে কাজ করবে কিনা তা নিশ্চিত করার জন্য অন্য স্তরটি নিয়ে আসে
আলেক্স

উত্তর:


319

আপনি নীচে validates_uniqueness_ofহিসাবে একটি কল সুযোগ করতে পারেন ।

validates_uniqueness_of :user_id, :scope => :friend_id

83
কেবল এটি যুক্ত করতে চেয়েছিলেন যে আপনি যদি 2 টিরও বেশি ক্ষেত্রে স্বতন্ত্রতা বৈধ করতে চান তবে আপনি একাধিক স্কোপ প্যারামগুলি পাস করতে পারেন। যেমন: সুযোগ => [: বন্ধু_আইডি,: গ্রুপ_আইডি]
ডেভ র্যাপিন

27
অদ্ভুত যে আপনি বলতে পারবেন না validates_uniqueness_of [:user_id, :friend_id]। এই কি প্যাচ করা প্রয়োজন?
অ্যালেক্সি

12
আলেক্সি, বৈধতা_পরিস্কারতা_এর [: ব্যবহারকারী_আইডি,: বন্ধু_আইডি] তালিকাভুক্ত প্রতিটি ক্ষেত্রের বৈধতা যাচাই করবে - এবং এটি নথিভুক্ত এবং প্রত্যাশিত আচরণ
নিকিতা হিমাটোভ

71
4 রেলগুলিতে, এটি হয়ে যায়: বৈধতা: ব্যবহারকারী_আইডি, স্বাতন্ত্র্য: {সুযোগ:: বন্ধু_আইডি}
মেরিনা মার্টিন

3
আপনি সম্ভবত একটি কাস্টম ত্রুটি যুক্ত করতে চান যেমন: বার্তা => 'ইতিমধ্যে এই বন্ধুটি রয়েছে' '
লাফস্টে

137

আপনি একটি কলামে validatesযাচাই করতে ব্যবহার করতে পারেন uniqueness:

validates :user_id, uniqueness: {scope: :friend_id}

একাধিক কলামে বৈধতার জন্য বাক্য গঠন একই, তবে পরিবর্তে আপনাকে ক্ষেত্রগুলির একটি অ্যারে সরবরাহ করা উচিত:

validates :attr, uniqueness: {scope: [:attr1, ... , :attrn]}

তবে উপরে বর্ণিত বৈধতা পদ্ধতির রেসের শর্ত রয়েছে এবং ধারাবাহিকতা নিশ্চিত করতে পারে না। নিম্নলিখিত উদাহরণ বিবেচনা করুন:

  1. ডাটাবেস সারণী রেকর্ডগুলি এন ক্ষেত্রগুলির দ্বারা স্বতন্ত্র বলে মনে করা হয় ;

  2. একাধিক ( দুই বা ততোধিক ) একযোগে অনুরোধ, পৃথক প্রক্রিয়া দ্বারা পরিচালিত প্রতিটি ( অ্যাপ্লিকেশন সার্ভার, পটভূমি কর্মী সার্ভার বা আপনি যা ব্যবহার করছেন ), টেবিলে একই রেকর্ড সন্নিবেশ করতে ডাটাবেস অ্যাক্সেস করুন;

  3. সমান্তরাল প্রতিটি প্রক্রিয়া যদি একই এন ক্ষেত্রের সাথে কোনও রেকর্ড থাকে তবে তা বৈধ হয় ;

  4. প্রতিটি অনুরোধের বৈধতা সাফল্যের সাথে পাস করা হয় এবং প্রতিটি প্রক্রিয়া একই ডেটা সহ টেবিলে একটি রেকর্ড তৈরি করে।

এই জাতীয় আচরণ এড়াতে, ডিবি টেবিলে একটি অনন্য বাধা যুক্ত করা উচিত । আপনি 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 

2

এটি দুটি কলামে একটি ডাটাবেস সীমাবদ্ধতার সাহায্যে করা যেতে পারে:

add_index :friendships, [:user_id, :friend_id], unique: true

আপনি একটি রেল যাচাইকারী ব্যবহার করতে পারেন, তবে সাধারণভাবে আমি একটি ডাটাবেস সীমাবদ্ধতা ব্যবহার করার পরামর্শ দিই।

আরও পঠন: https://robots.thoughtbot.com/ificationsation-datedia-constraint- বা-

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.