2011-11-23 15 views
7

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

मैं अपनी खुद की गैर-रूबी परियोजनाओं में उस व्यवहार की नकल करना चाहता हूं।

मेरा सवाल यह है कि यह वास्तव में कैसे काम करता है? मुझे पता है कि मैं रेल कोड देख सकता हूं, लेकिन मैं यह समझने में इतनी दूर नहीं हूं कि इसमें क्या हो रहा है।

मुझे पता है कि यह एक बेसलाइन स्क्रिप्ट लेता है और उसके बाद अद्यतन स्कीमा परिवर्तन चलाता है। लेकिन यह कैसे पता चलता है कि यह किस संस्करण पर है? मैं एक और ढांचे/डेटाबेस में नकल कैसे करूं?

+1

यह देखने के लिए कि आखिरी माइग्रेशन क्या था। यह उसके बाद आने वाले लोगों को चलाता है। * बहुत * मोटे तौर पर, यह एसक्यूएल लिखने के लिए एक डीएसएल है (3.1 में उलटा एसक्यूएल)। क्या आप अधिक विशिष्ट हो सकते हैं? –

+0

यह कई तरीकों से काम करता है ... इसका विशिष्ट पहलू आपको कैसे बढ़ाता है? –

+0

प्रश्न अद्यतन किया गया। मैं विशेष रूप से माइग्रेट और टियरडाउन (यानी रेक माइग्रेट रोलबैक) के बारे में बात कर रहा हूं। – Dan

उत्तर

21

नोट: यह रेल 2.x के रूप में सच है। यह रेल 3 के लिए सच नहीं हो सकता है, क्योंकि मैंने रेल 3 के साथ उतना समय नहीं बिताया है जितना मुझे पसंद आएगा।

रेल schema_migrations नामक एक विशेष छिपी हुई तालिका बनाता है। इस तालिका में version नामक एक कॉलम है। और आपके पास हर माइग्रेशन के लिए इस कॉलम में एक पंक्ति है। मूल्य टाइमस्टैम्प है जो माइग्रेशन फ़ाइल नाम टाइमस्टैम्प से मेल खाता है।

जब आप माइग्रेट करते हैं, तो यह आपके सभी माइग्रेशन कालक्रम क्रम में दिखता है (टाइमस्टैम्प आधारित नामकरण सम्मेलन के कारण वर्णमाला क्रम भी होता है)। प्रत्येक प्रवासन के लिए यह schema_migrations तालिका में एक मिलान पंक्ति की तलाश करता है। यदि यह एक खोजने में विफल रहता है, तो यह उस माइग्रेशन को चलाता है, और तालिका को टाइमस्टैंप जोड़ता है। अगर यह एक मिलता है, तो यह मानता है कि यह पहले से ही भाग गया है और बस इसे छोड़ देता है।

परिणाम यह है कि 2 डेवलपर्स दोनों किसी भी क्रम में माइग्रेशन कर सकते हैं, और यह ठीक है। ऐसा इसलिए है क्योंकि रेल जानता है कि माइग्रेशन कितने चल रहे हैं और जो नहीं है, इस पर ध्यान दिए बिना कि आपके डेटाबेस ने उन्हें कब देखा था।

तो ऐसा कुछ करने के लिए, आपको बस इस स्थिति को स्थायी रूप से स्टोर करने के लिए एक तरीका चाहिए कि कौन से कदम उठाए गए हैं और कौन नहीं है।

+0

यह वही है जो मैं खोज रहा था। बहुत बहुत धन्यवाद। – Dan

+0

इस संदर्भ में schema.rb की प्रासंगिकता क्या है? मैं डेटाबेस कॉलम के साथ सभी माइग्रेशन से मेल खाता हूं, मुझे schema.rb के लिए कोई उपयोग नहीं होगा? –

+0

यह फ़ोटोशॉप फ़ाइल की तरह है। माइग्रेशन परतें हैं और schema.rb संयुक्त परतों के अंतिम flattened परिणाम है। इसलिए यदि आपको अपने परीक्षण डेटाबेस में स्कीमा को लोड करने की आवश्यकता है तो आप एक ही परिणाम प्राप्त करने के लिए अनुक्रमिक रूप से सैकड़ों माइग्रेशन चलाने के बजाय इसे जल्दी से कर सकते हैं। –

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