কারা সংবেদনশীলতা "বৈধতা_পরিস্কারতা_সামান্য" ails


96

এখানে মডেলটি রয়েছে (আমি এসকিউএলাইট 3 ব্যবহার করছি):

class School < ActiveRecord::Base

  validates_uniqueness_of :name

end

উদাহরণস্বরূপ, আমি "ইয়েল" যুক্ত করার পরে, আমি "ইয়েল" যুক্ত করতে পারি না তবে "ইয়েল" যুক্ত করতে পারি। আমি কীভাবে বৈধতা মামলা সংবেদনশীল করতে পারি?

সম্পাদনা: এটি পাওয়া গেছে - সক্রিয় রেকর্ড বৈধতা

উত্তর:


232

validates_uniqueness_of :name, :case_sensitive => falseকৌতুকটি করে তবে আপনার মনে রাখা উচিত যে আপনার যদি একাধিক সার্ভার / সার্ভার প্রক্রিয়া থাকে (যেমন ফিউশন প্যাসেঞ্জার চালাচ্ছেন, একাধিক মংগ্রেল ইত্যাদি) বা একটি বহু-থ্রেডযুক্ত সার্ভার রয়েছে তবে স্বতন্ত্রতার গ্যারান্টি validates_uniqueness_ofদেয় না । এটি কারণ আপনি ইভেন্টগুলির এই ক্রমটি পেতে পারেন (ক্রমটি গুরুত্বপূর্ণ):

  1. প্রক্রিয়া এ 'foo' নাম দিয়ে একটি নতুন ব্যবহারকারী তৈরি করার জন্য একটি অনুরোধ পেয়েছে
  2. প্রক্রিয়া বি একই কাজ করে
  3. প্রক্রিয়া এ 'ডিও'র নামটি এখনও বিদ্যমান কিনা তা জিজ্ঞাসা করে' ফু 'এর স্বতন্ত্রতাটিকে বৈধতা দেয় এবং ডিবি বলে যে নামটি এখনও নেই।
  4. প্রক্রিয়া বি একই কাজ করে এবং একই প্রতিক্রিয়া পায়
  5. প্রক্রিয়া একটি insertনতুন রেকর্ডের জন্য বিবৃতি জমা দেয় এবং সফল হয়
  6. আপনার যদি সেই ক্ষেত্রটির জন্য স্বতন্ত্রতার প্রয়োজনের কোনও ডাটাবেস সীমাবদ্ধতা থাকে তবে প্রসেস বি insertনতুন রেকর্ডের জন্য বিবৃতি জমা দেবে এবং এসকিউএল অ্যাডাপ্টার থেকে ফিরে আসা একটি কুরুচিপূর্ণ সার্ভার ব্যতিক্রম সহ ব্যর্থ হবে । আপনার কাছে যদি কোনও ডাটাবেস সীমাবদ্ধতা না থাকে তবে সন্নিবেশটি সফল হবে এবং নাম হিসাবে আপনার কাছে এখন 'ফু' দিয়ে দুটি সারি থাকবে।

validates_uniqueness_ofরেল ডকুমেন্টেশনে "কনক্যুরঞ্জি এবং অখণ্ডতা" দেখুন ।

তৃতীয় সংস্করণে রুবি থেকে :

... এর নাম সত্ত্বেও, যাচাই_পরিচয়_আপনি গ্যারান্টি দেয় না যে কলাম মানগুলি অনন্য হবে। এটি যা করতে পারে তা যাচাই করে যাচাই করা হয় যে কোনও কলামের বৈধতা সম্পাদনের সময় রেকর্ডে যাচাইয়ের সময়কার মতো মূল্য নেই। একই সাথে দুটি রেকর্ড তৈরি করা সম্ভব, প্রতিটি কলামের জন্য একই মানের সাথে অনন্য হওয়া উচিত এবং উভয় রেকর্ডের জন্য বৈধতা পাস করা সম্ভব। স্বতন্ত্রতা প্রয়োগের সবচেয়ে নির্ভরযোগ্য উপায় হ'ল ডাটাবেস-স্তরের সীমাবদ্ধতা ""

আরও দেখুন এই প্রোগ্রামার অভিজ্ঞতা সঙ্গে validates_uniqueness_of

একটি নতুন উপায় তৈরি করার সময় একটি ওয়েব পেজ থেকে দুর্ঘটনাজনিত ডাবল-জমা দেওয়া হ'ল এটির একটি উপায়। এটি সমাধান করা খুব কঠিন কারণ ব্যবহারকারী যা ফিরে পাবে তা হ'ল দ্বিতীয় (কুরুচিপূর্ণ) ত্রুটি এবং এটি তাদের নিবন্ধন ব্যর্থ হওয়ার কথা ভাবায়, বাস্তবে এটি সফল হলে। এটি প্রতিরোধের জন্য আমি যে সর্বোত্তম উপায়টি খুঁজে পেয়েছি তা হ'ল ডাবল-জমা দেওয়া রোধ করার জন্য জাভাস্ক্রিপ্ট ব্যবহার করা use


4
একটি দ্রষ্টব্য হিসাবে - ডিবি-স্তরের প্রতিবন্ধকতাগুলি সমাধান করে এই সমস্যাটি সমাধানের চেষ্টা করার জন্য আমি একটি প্যাচ এখানে রেলগুলিকে জমা দিয়েছি: Rails.lightthouseapp.com/projects/8994-ruby-on-rails/tickets/…
জর্ডান বারো

এছাড়াও, বহুবর্ষজীবী "ব্যবহারকারীরা সাবমিট বাটনে ডাবল ক্লিক করেছেন" সমস্যা রয়েছে, তবে এটি ব্যবহার আরও একটি সমাধানের চেয়ে বেশি: অক্ষম_উইথ
ঘোটি

78

রেল 3 এ আপনি নিজের মডেলটিতে এটি করতে পারেন:

validates :name, :uniqueness => true

বা কেস_ সেনসিটিভিটি ছাড়াই

validates :name, :uniqueness => {:case_sensitive => false}

এই আমি চাই ঠিক কি।
জিগার ভট্ট

4
আমি 10 বছরেরও বেশি সময় ধরে রেলগুলি করছি। আমি বিশ্বাস করতে পারি না আমি কেবল এই বিকল্পটি সম্পর্কে শিখছি। কারও দক্ষতার স্তর নির্বিশেষে রেলগুলিতে সর্বদা নতুন কিছু শিখতে হয়।
ড্যানিয়েলিকেরকোডস

25

একটি বিকল্প রয়েছে যেখানে আপনি কেস সংবেদনশীলতা নির্দিষ্ট করতে পারেন

  validates_uniqueness_of :name, :case_sensitive => false

2

অনুরূপ প্রশ্ন রয়েছে তবে উত্তরটি আরও আকর্ষণীয়: https://stackoverflow.com/a/6422771

মূলত, ব্যবহার :case_sensitive => falseকরে একটি খুব অদক্ষ ডাটাবেস কোয়েরি সম্পাদন করে ।

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