2010-06-05 12 views
20

अब रेल के पास timestamped migrations है, /db/schema.rb के शीर्ष पर एकल संस्करण संख्या व्यर्थ लगता है। कई डेवलपर्स या एकाधिक शाखाओं से निपटने के दौरान कभी-कभी संस्करण संख्या गलत होती है।रेल: क्या 'schema.rb' में संस्करण संख्या कुछ भी है?

क्या रेल भी :version पैरामीटर का उपयोग भी करते हैं?

और क्या इसमें गलत कोई नुकसान है (जैसा कि: यह हाल ही में लागू प्रतिबद्धता के टाइमस्टैम्प को प्रतिबिंबित नहीं करता है)?

उदाहरण:

ActiveRecord::Schema.define(:version => 20100417022947) do 
    # schema definition ... 
end 

उत्तर

27

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

इसमें कुछ दिलचस्प प्रभाव हैं, विशेष रूप से ऐसे मामले में जहां कई लोग एक ही समय में नए माइग्रेशन करते हैं।

यदि आप अपनी schema.rb का संस्करण बनाते हैं, तो रेल टीम की सिफारिश की जाती है, तो आप ठीक हैं। आप एक संघर्ष (स्कीमा संस्करण) होने के लिए 100% गारंटीकृत हैं, और आने वाले/विलय करने वाले उपयोगकर्ता को अपने परिवर्तनों को विलय करके और संस्करण को दो में से उच्चतम में सेट करके इसे हल करना है। उम्मीद है कि वे यह विलय सही ढंग से करते हैं।

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

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

इस बिंदु पर सबसे अच्छा समाधान संभव है कि उपयोगकर्ता अपने विलय के समय अपने माइग्रेशन को पुनः-टाइमस्टैम्प करें।

आदर्श रूप से, मैं पसंद करूंगा कि schema.rb वास्तव में यहां अनुमानित माइग्रेशन नंबरों की एक सूची शामिल है, यहां तक ​​कि संस्करण: संस्करण। लेकिन मुझे संदेह है कि ऐसा होगा - रेल टीम का मानना ​​है कि समस्या schema.rb फ़ाइल में जांच करके पर्याप्त हल हो गई है।

+0

आप सही हैं, यह रेल 2.3 और * 3.0 में ऐसा है।* मुझे आश्चर्य है कि उनके पास टिकट के लिए खुला है या नहीं। –

+0

एक रेल टिकट जोड़ा गया: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5883 –

+4

मुझे यकीन नहीं है कि यह उत्तर सही साबित होता है, लेकिन ऐसा लगता है कि यह अब और नहीं है । Http://guides.rubyonrails.org/migrations.html#what-s-in-a-name पर नाम अनुभाग में क्या है यह स्पष्ट करता है कि रेल किसी भी माइग्रेशन को चलाने का प्रयास करेगा जो अभी तक नहीं चल रहा है। .. अगर बाद में निर्मित माइग्रेशन चलाया गया है। –

4

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

से: /lib/active_record/connection_adapters/abstract/schema_statements.rb

def assume_migrated_upto_version(version, migrations_path = ActiveRecord::Migrator.migrations_path) 
    # other code ... 
    unless migrated.include?(version) 
     execute "INSERT INTO #{sm_table} (version) VALUES ('#{version}')" 
    end 
    # ... 
संबंधित मुद्दे