2013-05-24 8 views
5

में डुप्लिकेट रिकॉर्ड को रोकने के अपने मॉडल में मैं इस है:का सही तरीका रेल

validates :name, :presence => true, :uniqueness => true 

मेरी नियंत्रक में मेरे पास है:

... 
if @location.save 
    format.html { redirect_to @location, :notice => 'Location was successfully created.' } 
    format.json { render :json => @location, :status => :created } 
... 
जो सफलतापूर्वक एक रिकार्ड बनाता है

अगर वहाँ पहले से ही एक नहीं है तालिका में इस नाम के साथ रिकॉर्ड करें। मुझे लगता है कि डीबी बाधाओं पर भरोसा करने के बजाय संभवतः डुप्लिकेट रिकॉर्ड डालने से पहले जांच करना अच्छा अभ्यास है?

मुझे लगता है कि मुझे नियंत्रक को कुछ जांचने के लिए जोड़ना चाहिए? ऐसा करने का सही तरीका क्या है?

बहुत धन्यवाद।

उत्तर

6

रिकॉर्ड डेटाबेस से रिकॉर्ड होने से पहले रेल द्वारा मान्य किया जाता है। यदि रिकॉर्ड एक सत्यापन में विफल रहता है, तो यह सहेज नहीं पाएगा, और .savefalse वापस करेगा, जो आपके नियंत्रक के निष्पादन के else खंड का कारण बन जाएगा। वह खंड आमतौर पर प्रदर्शित किए गए पृष्ठ को फिर से प्रस्तुत करता है, त्रुटियों के साथ प्रदर्शित किया जाता है ताकि उन्हें सही किया जा सके।

मान लें कि आपका नियंत्रक इस तरह बनाया गया है, आपको कुछ और करने की आवश्यकता नहीं है। आपको स्वाभाविक रूप से यह सुनिश्चित करना चाहिए कि किसी भी डेटाबेस की बाधाओं को आपके सत्यापन में प्रतिबिंबित किया गया हो, अन्यथा एक रिकॉर्ड सत्यापन को पारित कर सकता है लेकिन सहेजे जाने पर बाधा का उल्लंघन करने से त्रुटि उत्पन्न करता है।

5

आपको नियंत्रक में कुछ भी करने की आवश्यकता नहीं है।

The correct way to prevent duplicate records in Rails is used 
validation in model which you did correctly. 
2

आपके पास रेल में विशिष्टता को सत्यापित करने का सही तरीका है और यह मान्यताओं के माध्यम से है। आपको इसे नियंत्रक में जांचने की आवश्यकता नहीं है क्योंकि यह आपके लिए सत्यापन है।

याद रखें कि एक विशिष्टता सत्यापन जोड़ने से यह गारंटी नहीं मिलती है कि आपके पास डीबी में एक अद्वितीय रिकॉर्ड होगा। यह एपीआई में validates_uniqueness_of documentation में अच्छी तरह से समझाया गया है।

6

अपने डेटाबेस में एक अद्वितीय अनुक्रमणिका जोड़ें। इस तरह, अगर मॉडल सत्यापन (दुर्लभ, लेकिन तकनीकी रूप से संभव) के माध्यम से कुछ फिसल जाता है, तो डेटाबेस में सहेजने के लिए क्वेरी विफल हो जाएगी।

4

आपकी सत्यापन सही है। उपरोक्त सभी अन्य उत्तरों की तरह, हालांकि यह मानते हुए कि आप एकाधिक फ़ील्ड को सत्यापित करना चाहते हैं उदाहरण के लिए आपको एक इच्छासूची है, जो user_id और item_id लेता है, आपको इस आइटम के लिए प्रत्येक आइटम को केवल एक बार जोड़ा जाना चाहिए अपने मॉडल में सत्यापन के इस प्रकार जोड़ने

Class class_name < ActiveRecord::Base 
    validates_uniqueness_of :item_id, scope: :user_id 
end 
+0

आप उपयोग कर सकते हैं 'सत्यापन करती है: ITEM_ID, विशिष्टता: {गुंजाइश: user_id}' के बारे में http://www.rubydoc.info/github/bbatsov/rubocop/Rubocop/कॉप/रेल/मान्यता – Math

संबंधित मुद्दे