同じ構造の 2 つのデータベースがあります。テーブルには、Rails で使用されているように、主キーとして整数があります。
患者テーブルがある場合、1 つのデータベースで主キー 123 を使用する 1 人の患者と、別のデータベースで同じ主キーを使用する別の患者が存在します。
両方のデータベースのデータをマージするために何を提案しますか?
同じ構造の 2 つのデータベースがあります。テーブルには、Rails で使用されているように、主キーとして整数があります。
患者テーブルがある場合、1 つのデータベースで主キー 123 を使用する 1 人の患者と、別のデータベースで同じ主キーを使用する別の患者が存在します。
両方のデータベースのデータをマージするために何を提案しますか?
config/database.yml のエントリを使用して両方のデータベースを設定し、新しい移行を生成します。
ActiveRecord::Base.establish_connection を使用して、次のように移行で 2 つのデータベースを切り替えます。
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。
データベースがまったく同じで (データにカスタム処理を必要としない)、レコードが多すぎない場合は、次のようにすることができます (外部キーが許可されます)。
テストされていません...しかし、あなたはアイデアを得る
#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 または何かのグループで行います。
ところで、これは移行ではなくレーキまたはカピストラーノのタスクである方がおそらく理にかなっています。