2008-10-03 11 views
5

मेरे पास एक ही संरचना के साथ दो डेटाबेस हैं। सारणी में रेल की तरह प्राथमिक कुंजी के रूप में पूर्णांक होता है।रेल डेटाबेस विलय

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

दोनों डेटाबेस से डेटा विलय करने के लिए आप क्या सुझाव देंगे?

+0

आप किस डेटाबेस इंजन का उपयोग कर रहे हैं? इसके अलावा (मेरे पास बहुत रेल अनुभव नहीं है), क्या रेल नए रिकॉर्ड के लिए आईडी निर्दिष्ट करते हैं या डेटाबेस इंजन ऐसा करता है? – Neall

+0

रेल में ids को अनुक्रम या autoincrement पूर्णांक फ़ील्ड प्रकार का उपयोग कर डेटाबेस द्वारा असाइन किया जाता है। – hectorsq

उत्तर

10

कॉन्फ़िगर/डेटाबेस.इमएल में प्रविष्टियों के साथ अपने डेटाबेस दोनों सेट करें, फिर एक नया माइग्रेशन उत्पन्न करें।

उपयोग ActiveRecord :: Base.establish_connection इस तरह प्रवास में दो डेटाबेस के बीच स्विच करने के लिए:

def self.up 
    ActiveRecord::Base.establish_connection :development 
    patients = Patient.find(:all) 
    ActiveRecord::Base.establish_connection :production 
    patients.each { |patient| Patient.create patient.attributes.except("id") } 
end 

YMMV अभिलेखों की संख्या और मॉडलों के बीच संघों के आधार पर।

+0

जब मैंने विकास से उत्पादन में डेटाबेस स्विच किया, तो मुझे समस्या का सामना करना पड़ रहा है, फिर रोगियों के चर अद्यतनों पर रिकॉर्ड। उदाहरण के लिए मेरे पास विकास में 10 उपयोगकर्ता हैं और 3 उत्पादन में हैं जब मैंने डाटाबेस को स्विच किया है, मरीज़ वैरिएबल 10 उपयोगकर्ताओं से 3 में परिवर्तित हो गया है। क्या आप कृपया मदद कर सकते हैं। :) –

0

बीटीडब्ल्यू यह संभवतः माइग्रेशन के बजाए रेक या कैपिस्ट्रानो कार्य होने के लिए अधिक समझ में आता है।

5

अपने डेटाबेस बिल्कुल एक जैसे हैं (डेटा कस्टम प्रसंस्करण की आवश्यकता नहीं है) और वहाँ भी कई रिकॉर्ड नहीं कर रहे हैं, तो आप ऐसा कर सकता है (जो विदेशी चाबी के लिए अनुमति देता है):

untested है .. । लेकिन आप विचार

#All models and their foreign keys 
tales = {Patients => [:doctor_id, :hospital_id], 
     Doctors => [:hospital_id], 
     Hospitals} 

ActiveRecord::Base.establish_connection :development 

max_id = tables.map do |model| 
    model.maximum(:id) 
end.max + 1000 


tables.each do |model, fks| 
    ActiveRecord::Base.establish_connection :development 
    records = model.find(:all) 

    ActiveRecord::Base.establish_connection :production 
    records.each do |record| 
    #update the foreign keys 
    fks.each do |attr| 
     record[attr] += max_id if not record[attr].nil? 
    end 
    record.id += max_id 

    model.create record.attributes 
    end 
end 

मिल आप रिकॉर्ड की एक बहुत है, तो आप इस बाहर किसी भी तरह भाग हो सकता है ... 10k या कुछ और के समूह में करते हैं।