2008-10-03 10 views
5

Tôi có hai cơ sở dữ liệu có cùng cấu trúc. Các bảng có một số nguyên làm khóa chính như được sử dụng trong Rails.Cơ sở dữ liệu hợp nhất Rails

Nếu tôi có bảng bệnh nhân, tôi sẽ có một bệnh nhân sử dụng khóa chính 123 trong một cơ sở dữ liệu và một bệnh nhân khác sử dụng cùng một khóa chính trong cơ sở dữ liệu khác.

Bạn sẽ đề xuất gì để hợp nhất dữ liệu từ cả hai cơ sở dữ liệu?

+0

Bạn đang sử dụng công cụ cơ sở dữ liệu nào? Ngoài ra (tôi không có nhiều trải nghiệm Rails), Rails có gán các id cho các bản ghi mới hoặc không làm cho cơ sở dữ liệu làm việc đó? – Neall

+0

Trong Rails, các id được chỉ định bởi cơ sở dữ liệu bằng cách sử dụng một loại trường tự nhiên hoặc chuỗi số nguyên tự động. – hectorsq

Trả lời

10

Đặt cả hai cơ sở dữ liệu của bạn với mục nhập trong config/database.yml, sau đó tạo một di chuyển mới.

Sử dụng ActiveRecord :: Base.establish_connection để chuyển đổi giữa hai cơ sở dữ liệu trong di cư như thế này:

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 tùy thuộc vào số lượng hồ sơ và các mối liên quan giữa các mô hình.

+0

Tôi đang đối mặt với vấn đề khi tôi chuyển cơ sở dữ liệu từ phát triển sang sản xuất, sau đó các hồ sơ về biến bệnh nhân được cập nhật. ví dụ: tôi có 10 người dùng đang phát triển và 3 người dùng trong sản xuất khi tôi chuyển sang cơ sở dữ liệu biến bệnh nhân được chuyển đổi từ 10 người dùng thành 3. Bạn có thể vui lòng trợ giúp không. :) –

0

BTW có thể có ý nghĩa hơn đối với việc này là công việc cào hoặc viết hoa văn hơn là di chuyển.

5

Nếu cơ sở dữ liệu của bạn là hoàn toàn giống nhau (các dữ liệu không đòi hỏi chế biến tùy chỉnh) và không có quá nhiều hồ sơ, bạn có thể làm điều này (cho phép cho các phím nước ngoài):

chưa được kiểm tra .. . Nhưng bạn sẽ có được ý tưởng

#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 

Nếu bạn có rất nhiều hồ sơ bạn có thể phải phần này ra bằng cách nào đó ... làm điều đó trong nhóm của 10k hoặc một cái gì đó.