0

4つのモデルを検討(非常に単純化)

class Group1 << AR::Base
  has_many group1_items
end
class Group2 << AR::Base
  has_many group2_items
end

class GroupItem << AR::Base
  belongs_to :group1
  belongs_to :thing
end
class Group2Item << AR::Base
  belongs_to :group2
  belongs_to :thing
end

Group2 と Group2Items を Group1 と Group1Items に「マージ」したいと考えています。Group2 は Group1 から継承します。私が欲しいもの:

class Group2 << Group1

Group2Item モデルは使用されません。

Group2 および Group2Items データを Group1 および Group1Item テーブルに「移動」するための移行を作成する必要があります。

アプリケーションの状態に関係なく、移行にアクセスできる必要があります。つまり、Group2 および Group2Item テーブルが存在できないため、mySQL 構文でこれを行う必要があります。

これを行う簡単な方法はありますか?

4

1 に答える 1

1
def up
  change_table :group1s do |t|
    t.string :type       # add a 'type' column for STI
    t.integer :old_id    # add a temporary column to hold the original 'id'
  end

  execute("UPDATE group1s SET `type` = 'Group1';")

  merge_items_sql = <<SQL
    INSERT INTO group1s (`type`, old_id, other_field_names...) 
    SELECT 'Group2', group2s.id, other_field_values...
    FROM group2s;

    INSERT INTO group1_items(group1_id, thing_id )
    SELECT group1s.id, group2_items.thing_id
    FROM group2_items
    JOIN group1s ON group2_items.group2_id = group1s.old_id;
SQL

  execute(merge_items_sql)

  # leave this out until you have verified that all data has merged properly
  drop_table :group2_items
  drop_table :group2s
  remove_column :group1s, :old_id
end
于 2013-04-18T15:08:52.820 に答える