5

同じ構造の 2 つのデータベースがあります。テーブルには、Rails で使用されているように、主キーとして整数があります。

患者テーブルがある場合、1 つのデータベースで主キー 123 を使用する 1 人の患者と、別のデータベースで同じ主キーを使用する別の患者が存在します。

両方のデータベースのデータをマージするために何を提案しますか?

4

3 に答える 3

10

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。

于 2008-10-04T02:40:09.877 に答える
5

データベースがまったく同じで (データにカスタム処理を必要としない)、レコードが多すぎない場合は、次のようにすることができます (外部キーが許可されます)。

テストされていません...しかし、あなたはアイデアを得る

#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 または何かのグループで行います。

于 2008-10-04T06:26:35.770 に答える
0

ところで、これは移行ではなくレーキまたはカピストラーノのタスクである方がおそらく理にかなっています。

于 2008-10-04T05:27:39.727 に答える