2009-04-15 33 views
11

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

मैं वैकल्पिक तरीकों से सुझावों के बाद हूं और क्यों वे माइग्रेशन का उपयोग करने से बेहतर विचार हो सकते हैं।

उत्तर

14

एक समस्या यह है कि अगर आपके द्वारा दी गई

rake db:reset 

और

rake db:schema:load 

कार्य है, जो अपने डेटाबेस की स्थापना के लिए आधार के रूप में schema.rb का उपयोग का उपयोग आता है। तो कोई डेटा लोड नहीं होता है और आप अटक जाते हैं।

Agile Web Development with Rails, Third Edition में, (? यदि रूबी पुस्तक "कुदाल से मिट्टी खुरपना" पुस्तक है, यह "झूला" पुस्तक, btw होना चाहिए) है जो आप मिलना चाहिए अगर आपने पहले से ऐसा नहीं किया है, DHH का कहना है:

... माइग्रेशन वास्तव में बीज डेटा ले जाने के लिए नहीं हैं। वे विश्वसनीय रूप से ऐसा करने के लिए प्रकृति में बहुत अस्थायी हैं। माइग्रेशन से एक ताजा स्कीमा बनाने के लिए अगले करने के लिए स्कीमा के एक संस्करण से आप लाने के लिए, नहीं यहाँ हैं खरोंच हम उस के लिए db/schema.rb फ़ाइल है।

तो, जैसे ही आप वास्तव में कोई वास्तविक आवेदन के साथ जा पाने के रूप में, लोगों को नहीं अपनी प्रारंभिक माइग्रेशन चल रहा है जब वे आवेदन की स्थापना की जाएगी। वे से शुरू करेंगे जो भी संस्करण डीबी/schema.rb में संग्रहीत है और उन सभी पिछले माइग्रेशन को अनदेखा करें। इसका अर्थ यह है कि माइग्रेशन द्वारा बनाए गए किसी भी डेटा को डेटाबेस में कभी भी नहीं बनाया गया है, इसलिए आप इस पर भरोसा नहीं कर सकते हैं।

अधिक स्थायी बीज डेटा रखने के वैकल्पिक तरीके हैं। सबसे आसान शायद डीबी/seed.rb में एक नई फ़ाइल बनाने के लिए, जिसमें उत्पाद.क्रेट कॉल शामिल हैं जो सेटअप करेंगे। रेक फ़ाइल के बाद इस फ़ाइल को कहा जा सकता है: स्कीमा: लोड प्रारंभिक स्कीमा बनाता है।

+1

असल में, 'रेक डीबी: रीसेट' भी 'रेक डीबी: बीज' चलाता है, इसलिए आपके बीजों की फाइल में कोई भी डेटा लोड हो जाता है। – lobati

4

कई बार, माइग्रेशन सबसे अच्छे फिट होते हैं और उन्हें एक अलग स्क्रिप्ट के साथ प्रतिस्थापित नहीं किया जा सकता है। निम्नलिखित परिदृश्य की कल्पना करें: एप्लिकेशन पहले से ही लाइव डेटा के साथ उपयोग में है; कोड कॉलम में "name-zip_code" रूप में एक कोड होता है (हाँ मुझे पता है कि यह बदसूरत है, लेकिन ऐसा होता है), और आप इसे दो कॉलम, 'नाम' और 'zip_code' में विभाजित करना चाहते हैं, जबकि ' कोड 'कॉलम।


def self.up 
    add_column :companies, :zip_code, :integer 
    add_column :companies, :name, :string 
    Company.reset_column_information 
    Company.find(:all).each do |company| 
    name, zip_code = company.code.split('-') 
    company.update_attributes(:name => name, :zip_code => zip_code) 
    end 
    remove_column :companies, :code 
end 

इस मामले में, कोड कॉलम को नाम और ज़िप कोड कॉलम में स्थानांतरित करने से पहले कोड कॉलम को हटाया नहीं जा सकता है।

1

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

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