2011-12-20 15 views
25

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

क्या किसी ने इस तरह की चीज पहले की है? मैं mongoid_rails_migrations पर आया हूं, लेकिन यह किसी भी प्रकार का दस्तावेज प्रदान नहीं करता है, और ऐसा लगता है कि ऐसा करता है, मुझे सच में यकीन नहीं है कि इसका उपयोग कैसे किया जाए।

मुझे इंगित करना चाहिए कि मैं केवल ActiveRecord माइग्रेशन के साथ अवधारणा से परिचित हूं।

+0

मुझे नहीं लगता कि आलसी माइग्रेशन एक अच्छा विचार कर रहे हैं की सराहना करेंगे:

यहाँ मैं के साथ आया है। मैं बड़े पैमाने पर डेटा अपडेट चलाने के लिए समय लेता हूं, इसे पूरा करने, निगरानी करने, प्रतीक्षा करने के तरीके के बारे में सोचने के लिए प्रतीक्षा करें, अगर कुछ भी गलत हो जाता है, और डेटाबेस क्लोन पर पहले परीक्षण करें। इसमें समय लगता है लेकिन यह आपको डेटा असंगतता के साथ नहीं छोड़ेगा। –

उत्तर

21

यदि आप एक बार में संपूर्ण माइग्रेशन करना चाहते हैं, तो mongoid_rails_migrations आपको जो चाहिए वह करेगा। दस्तावेज़ के लिए वास्तव में बहुत कुछ नहीं है, यह मानक ActiveRecord माइग्रेशन की कार्यक्षमता को डुप्लिकेट करता है। आप अपने माइग्रेशन लिखते हैं, और फिर आप उन्हें लागू करने के लिए rake db:migrate का उपयोग करते हैं और यह पता लगाता है कि कौन से हैं और भाग नहीं गए हैं। यदि आप कुछ विशिष्ट हैं जो आप इसके बारे में जानना चाहते हैं तो मैं और प्रश्नों का उत्तर दे सकता हूं।

आलसी माइग्रेशन के लिए, सबसे आसान समाधान after_initialize कॉलबैक का उपयोग करना है। अगर एक क्षेत्र पुराने डेटा योजना से मेल खाता है की जाँच करें, और अगर यह होता है तो आप इसे वस्तु को संशोधित करने और अद्यतन यह है, तो उदाहरण के लिए:

class Person 
    include Mongoid::Document 

    after_initialize :migrate_data 

    field :name, :type => String 

    def migrate_data 
     if !self[:first_name].blank? or !self[:last_name].blank? 
      self.set(:name, "#{self[:first_name]} #{self[:last_name]}".strip) 
      self.remove_attribute(:first_name) 
      self.remove_attribute(:last_name) 
     end 
    end 
end 

समझौतों से विशिष्ट दृष्टिकोण मैं ऊपर दे दी है साथ ध्यान में रखना:

यदि आप कोई अनुरोध चलाते हैं जो Person.all.each {|p| puts p.name} जैसे कई रिकॉर्ड लौटाता है और 100 लोगों के पास पुराना प्रारूप होता है, तो यह तुरंत 100 सेट क्वेरी चलाएगा। आप इसके बजाय self.name = "#{self.first_name} #{self.last_name}".strip पर भी कॉल कर सकते हैं, लेकिन इसका मतलब है कि रिकॉर्ड सहेजा गया है तो आपका डेटा केवल माइग्रेट किया जाएगा।

आपके पास सामान्य समस्याएं हो सकती हैं कि Person.where(:name => /Foo/).count जैसे किसी भी बड़े प्रश्न विफल हो जाएंगे जब तक कि सभी डेटा माइग्रेट नहीं हो जाते। अगर आप Person.only(:name).first करते हैं तो माइग्रेशन विफल हो जाएगा क्योंकि आप first_name और last_name फ़ील्ड शामिल करना भूल गए हैं।

7

जॅचरी अनकर ने अपने उत्तर में बहुत कुछ समझाया है। Mongoid_rails_migrations माइग्रेशन के लिए एक अच्छा विकल्प है।

यहाँ उदाहरण के साथ कुछ लिंक है कि उपयोगी आप के माध्यम से जाने के लिए और का उपयोग mongoid_rails_migrations

Mongoid Migrations using the Mongo Driver

Embedding Mongoid documents and data migrations

अन्य तो यह Readme लागू करने के लिए इस उदाहरण के साथ पर्याप्त होना चाहिए करने के लिए होगा mongoid माइग्रेशन

3

मुझे वही आवश्यकता है। https://github.com/nviennot/mongoid_lazy_migration

मैं खुशी कुछ प्रतिक्रिया

+0

यह बिल्कुल सही चीज़ की तरह दिखता है, भयानक! –

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