2013-04-18 2 views
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 не могут присутствовать, поэтому мне нужно сделать это juste в синтаксисе mySQL.

Есть ли простой способ сделать это?

ответ

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 
+0

Какой ответ! Спасибо, кажется, идеально. – pierallard

Смежные вопросы