2009-01-13 12 views
16

मेरे पास एक छोटा डेटाबेस है और एक रेल पेज के माध्यम से प्रविष्टियां जोड़ रहा है। मैंने प्रविष्टियों में से एक को "नष्ट कर दिया" और अब आईडी के मेरे अनुक्रम एक से छोड़ रहे हैं। उदाहरण के लिए, अब मेरे पास 42, 44, 44 है। 42, 43, 44.रेल कंसोल से डाटाबेस आईडी संशोधित करना?

मैं सोच रहा था कि कंसोल के माध्यम से एक नई वस्तु के आईडी नंबर को संपादित करने का कोई तरीका था या नहीं। मैंने कोशिश की है:

record.id = 43 
record.save 

और

record = record.new 
record.attributes = { :id => 43 } 

लेकिन दोनों काम नहीं किया। मुझे काफी यकीन है कि इसके लिए एक कंसोल विधि होनी चाहिए, लेकिन मुझे Google पर बहुत विशिष्ट नहीं लगता है और शायद मैं रेल एपीआई को गलत तरीके से पढ़ता हूं ... क्या मुझे संभवतः एसक्यूएलटी में सीधे एसक्यूएल के माध्यम से ऐसा करना होगा ?

धन्यवाद

उत्तर

4

मैं संभवतः SQLite में प्रत्यक्ष एसक्यूएल के माध्यम से ऐसा करने के लिए है?

हां।

ActiveRecord का पूरा बिंदु यह है कि डीबी फ़ंक्शंस सार तत्व है और केवल डेटा संग्रह संग्रह देता है। आपको रिकॉर्ड की आईडी के बारे में चिंता नहीं करनी चाहिए, जो कि डीबी के लिए विशिष्ट है। मेरे सिर के ऊपर से मैं मॉडल की आईडी को संदर्भित करने के किसी भी कारण से नहीं सोच सकता।

यदि आपका ऐप अनुक्रमित संख्या होने पर निर्भर करता है तो आपको मॉडल में एक और फ़ील्ड जोड़ना चाहिए जिसमें यह है। उदाहरण के लिए, यदि मेरे पास उत्पादों (एक उत्पाद मॉडल) के साथ एक स्टोर है और मैं आईडी नंबर देता हूं तो डीबी अन्य विक्रेताओं को प्रदान करता है। दो हफ्ते बाद, मेरे मालिक ने मुझे एक अद्वितीय, लेकिन उत्पादों की दो भिन्नताओं के लिए समान आईडी रखने के लिए कहा: "45 ए" और "45 बी"। नट। आईडी फ़ील्ड का उपयोग केवल डेटाबेस और ActiveRecord तक किया जाना चाहिए, न कि आपके या आपके उपयोगकर्ताओं को रिकॉर्ड की पहचान करने के लिए।

वहाँ एक छोटा सा मौका है कि एक अस्पष्ट विधि हो सकती है जो आईडी को सेट करता है यदि डीबी इसे अनुमति देता है, लेकिन यह किसी कारण से अस्पष्ट है। कोशिश न करें और इसे ढूंढें :)

यह कहा जा रहा है कि, ruby script/dbconsole टाइप करें ताकि आप अपना पासवर्ड टाइप किए बिना स्क्लाइट इंटरफेस को जल्दी से खींच सकें।

इसके अलावा, यदि आप एसक्लाइट डेटाबेस को हटाते हैं जो काउंटर को रीसेट करेगा और 0 से शुरू होगा। महान शक्ति के साथ बड़ी ज़िम्मेदारी आती है।

संपादित

तो मुझे याद है सही ढंग से डेव थॉमस इस कहीं के बारे में लिखा था। शायद here?

+1

यह वास्तव में एक अस्पष्ट और अनुपयोगी टिप्पणी थी। फ़्लैगिंग के लायक नहीं है, लेकिन संशोधित करने लायक है। – ivanreese

23

असल में, आप नई वस्तुओं के लिए मैन्युअल रूप से आईडी सेट कर सकते हैं:

record = Record.new 
record.id = 1234 
record.save 

हालांकि, तुम क्या करने की कोशिश कर रहे हैं किसी मौजूदा ऑब्जेक्ट की आईडी को अद्यतन है।जब आप record.id = 43 सेट और फिर save फोन क्या होता है कि ActiveRecord इस तरह एसक्यूएल उत्पन्न करने की कोशिश करेंगे है:

update records set id = 43 where id = 43

सूचना कि आईडी इसे अद्यतन करने की तलाश में एक तुम कोशिश कर रहे हैं के रूप में ही है बदलने के लिए। यही कारण है कि यह काम नहीं करता है।

तो हाँ, आपको इसे बदलने के लिए SQL का उपयोग करना होगा। चाहे यह एक अच्छा विचार है या नहीं, एक और मुद्दा है, लेकिन कभी-कभी इसे करने की आवश्यकता होती है।

+0

पहला कोड मेरे लिए काम किया। धन्यवाद! –

+1

ग्रेट सॉल्यूशन, काश मैं शीर्ष पर पहुंचने के लिए इसे दोबारा वोट दे सकता हूं। मुझे ऐसे समाधान पसंद हैं जो समस्या की व्याख्या करते हैं। और मुझे सामान्यीकृत "enums" को लागू करने के लिए इसका उपयोग मिला है। उदाहरण के लिए, एक उपयोगकर्ता के पास कई भूमिकाएं हो सकती हैं, लेकिन उन भूमिकाओं को तैनाती में लगातार किया जा रहा है, इसलिए मैं उन्हें रेक कार्य के साथ जोड़ता हूं। हार्ड आईडी कोडिंग उनके आईडी के सुनिश्चित करता है कि वे मेरे स्थानीय बॉक्स और सर्वर पर समान हैं। Nitpicky, और संभवतः कभी जरूरत नहीं है, लेकिन यह मुझे थोड़ा कम twitchy बनाता है :) –

39

ऐसा करने का सबसे अच्छा तरीका एसक्यूएल को सीधे निष्पादित करना है, और अनुक्रम में इस अस्थायी गड़बड़ी को हल करना है।

>> sql = "update records set id=43 where id=44" 
>> ActiveRecord::Base.connection.execute(sql) 

कहाँ 44 है नव निर्मित वस्तु की आईडी, और 43 एक आप अपनी तालिका

गुड लक में लापता थे है:

कंसोल (रूबी स्क्रिप्ट/कंसोल) और प्रकार पहुंच बनाने का प्रयास !

+0

यह मेरे लिए काम किया। धन्यवाद! –

+1

मैं मानता हूं कि एक आईडी बदलना एक बुरा विचार है, लेकिन जब आपको डेटा को पुनर्स्थापित करने की आवश्यकता होती है, तो, जब आप कुछ रिकॉर्ड खो चुके हैं तो एक उत्पादन डेटाबेस कहें? यह पूर्ण है। –

+2

भी अच्छा है यदि आपके पास दो सिस्टम हैं जिन्हें सिंक करना है .. – baash05

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