2008-10-03 31 views
5

Mam dwie bazy danych o tej samej strukturze. Tabele mają liczbę całkowitą jako klucz podstawowy używany w Railsach.Scalanie baz danych szyn

Jeśli mam tabelę pacjentów, będę mieć jednego pacjenta za pomocą klucza podstawowego 123 w jednej bazie danych i innego pacjenta, używając tego samego klucza podstawowego w innej bazie danych.

Co sugerowałbyś do połączenia danych z obu baz danych?

+0

Jakiego silnika bazy danych używasz? Również (nie mam zbyt wiele doświadczeń Rails), czy Railsy przypisują identyfikatory do nowych rekordów lub czy silnik bazy danych to robi? – Neall

+0

W Railsach identyfikatory są przypisywane przez bazę danych za pomocą typu pola lub autoinkrementu typu liczba całkowita. – hectorsq

Odpowiedz

10

Ustaw obie bazy danych w górę z wpisami w config/database.yml, a następnie wygeneruj nową migrację.

Zastosowanie ActiveRecord :: Base.establish_connection aby przełączać się między dwoma bazami danych w migracji tak:

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 zależności od liczby rekordów i powiązań między modelami.

+0

Mam problem, kiedy przełączyłem bazę danych z rozwoju do produkcji, a następnie zaktualizowano rekordy dotyczące zmiennej pacjenta. np. mam 10 użytkowników w fazie rozwoju i 3 w produkcji, kiedy zmieniłem bazę danych zmienną pacjenta przeliczoną z 10 użytkowników na 3. Czy możesz pomóc. :) –

0

BTW prawdopodobnie ma większe poczucie, że jest to raczej grabie lub capistrano niż migracja.

5

Jeśli bazy danych są dokładnie takie same (dane nie wymagają przetwarzania niestandardowy) i nie ma zbyt wiele rekordów, można to zrobić (co pozwala na klucze obce):

Nietestowane .. . Ale masz pomysł

#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 

Jeśli masz dużo rekordów może trzeba to jakoś części ... to zrobić w grupach 10k czy coś.