2010-08-16 4 views
1

J'ai un tableau de produits et un de ProductGroups pour les classer. Maintenant, les ProductGroups seront supprimés et leurs données fusionnées dans la table Products.Migration des rails; fusionner deux modèles

J'ai effectué une migration qui traverse les enregistrements ProductGroup existants et les ajoute en tant que produits. Ceci afin que nous n'ayons pas à entrer de nouveau des centaines de groupes manuellement. Ensuite, la table product_groups est supprimée.

Ensuite, j'ai supprimé le modèle ProductGroup, les contrôleurs et ainsi de suite et j'ai validé les modifications. Cela a bien fonctionné en développement, mais évidemment si je mets maintenant à jour l'application de production, il faudra d'abord appliquer les changements du système de fichiers (suppression du modèle ProductGroup etc.) et la migration échouera car le modèle n'existe plus.

Quelle est la meilleure façon de résoudre ce problème? Ne devrais-je pas mettre le transfert de données dans une migration? Cela ressemble à catch-22.

Répondre

2

Je n'ai pas ce que le problème est que si vous voulez faire tout en une seule migration, il peut ressembler à

class UpdateProducts < ActiveRecord::Migration 
    def self.up 
    add_column :products, :columns, :types 

    Product.all.each do |product| 
     product.update_attributes(ProductGroup.find_by_id(product.product_group_id).attributes) 
     product.save 
    end 

    system("ruby script/destroy scaffold product_group") 

    drop_table :product_groups 
    end 

    def self.down 
    remove_column :products, :columns 
    create_table :product_groups 
    end 
end 
+0

Merci pour la suggestion, qui est en fait plus ou moins ce que je fini par faire; migré les données d'abord, puis mis à jour le code, en supprimant le modèle ProductGroup. Mais si quelqu'un d'autre avait appliqué mon engagement sans savoir ce que je faisais, il aurait certainement eu des problèmes. Ou si quelqu'un d'autre devait mettre à jour son dépôt plus tard. Heureusement que ce n'était pas un problème cette fois (c'est un projet solo), mais j'aimerais connaître une meilleure solution pour l'avenir. –