रेलें: दो कॉलमों की अद्वितीयता (एक साथ)


130

मेरे पास एक Releaseमॉडल है mediumऔर countryकॉलम (दूसरों के बीच)। ऐसा नहीं होना चाहिए releasesकि समान medium/ countryसंयोजन साझा करें ।

मैं इसे रेल सत्यापन के रूप में कैसे लिखूंगा?


जवाबों:


230

आप विकल्प के साथ एक विशिष्टता सत्यापन का उपयोग कर सकते हैं scope

साथ ही, आपको लिखे जाने से पहले नए रिकॉर्ड को मान्यताओं को पारित करने से रोकने के लिए DB में एक अद्वितीय सूचकांक जोड़ना चाहिए:

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end

इंडेक्स के लिए +1, लेकिन -1 के लिए uniqueयह मान्यता प्राप्त नहीं है। उस भाग के लिए मैंने नीचे उत्तर का उपयोग किया है।
एलेक्स

7
हाँ, क्षमा करें, सत्यापन कुंजी होनी चाहिए uniqueness, नहीं unique। लिंक किए गए दस्तावेज़ देखें। जवाब तय करना।
जूना

1
एचएम, अच्छा, धन्यवाद :) खुद को दोहराने के लिए - इंडेक्स डालने से समाधान अगले स्तर पर आता है, न कि अन्य "कोडिंग" समाधानों की तरह जो मैं इस जवाब को खोजने से पहले चला रहा हूं। इसके लिए +1
Aleks

70

उपरोक्त सभी उत्तर गायब हैं कि एक मॉडल में कई विशेषताओं की विशिष्टता को कैसे मान्य किया जाए। नीचे दिए गए कोड में यह बताने का इरादा है कि एक दायरे में कई विशेषताओं का उपयोग कैसे किया जाए।

validates :country, uniqueness: { scope: [:medium, :another_medium] }

यह countryसभी पंक्तियों में mediumऔर के मूल्यों के साथ विशिष्टता को मान्य करता है another_medium

नोट: उपरोक्त कॉलम पर एक इंडेक्स जोड़ना न भूलें, यह तेजी से पुनर्प्राप्ति को सुनिश्चित करता है और अद्वितीय रिकॉर्ड के लिए DB स्तर की मान्यता जोड़ता है।

अद्यतन: तालिका बनाते समय एक सूचकांक जोड़ने के लिए

t.index [:medium, :another_medium], unique: true

41

आप :scopeअपने सत्यापनकर्ता को इस तरह एक पैरामीटर पास कर सकते हैं :

validates_uniqueness_of :medium, scope: :country

कुछ और उदाहरणों के लिए प्रलेखन देखें ।


8
@ डेनिसबेस्ट यह "काम करता है", लेकिन यह दौड़ की स्थिति से रक्षा नहीं करता है। यदि दो ग्राहक एक साथ अनुरोध करते हैं, तो वे दोनों सत्यापन को पारित कर सकते हैं यदि न तो दूसरे के मान्य होने से पहले डेटाबेस के लिए प्रतिबद्ध है। आपको टॉम्पेव के उत्तर के रूप में एक डेटाबेस अद्वितीय बाधा की भी आवश्यकता है।
सूपडॉग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.