Je suis terrible à nommer et réaliser qu'il y a un meilleur ensemble de noms pour mes modèles dans mon application Rails. Existe-t-il un moyen d'utiliser une migration pour renommer un modèle et sa table?
Réponses
Trop de publicités?Voici un exemple:
class RenameOldTableToNewTable< ActiveRecord:Migration
def self.up
rename_table :old_table_name, :new_table_name
end
def self.down
rename_table :new_table_name, :old_table_name
end
end
Je devais aller et renommer le fichier de déclaration du modèle manuellement.
Modifier:
Dans Rails 3.1 et 4, ActiveRecord :: Migration :: CommandRecorder sait comment inverser les migrations rename_table, vous pouvez donc:
class RenameOldTableToNewTable< ActiveRecord:Migration
def change
rename_table :old_table_name, :new_table_name
end
end
(Vous devez toujours passer par et renommer manuellement vos fichiers.)
Dans Rails 4, tout ce que j'avais à faire était le changement de
def change
rename_table :old_table_name, :new_table_name
end
Et tous mes index ont été pris en charge pour moi. Je n'avais pas besoin de mettre à jour manuellement les index en supprimant les anciens et en en ajoutant de nouveaux.
Et cela fonctionne en utilisant le changement pour monter ou descendre en ce qui concerne les index aussi bien.
Les autres réponses et commentaires couverts de table de renommage, renommer des fichiers, et grepping l'aide de votre code.
Je tiens à ajouter quelques bémols:
Prenons un exemple concret, j'ai fait face aujourd'hui: le fait de renommer un modèle à partir de 'Marchand' de 'Entreprise.'
- N'oubliez pas de changer les noms de tables dépendantes et des modèles dans la même migration. J'ai changé mon Marchand et MerchantStat modèles d'Affaires et de BusinessStat en même temps. Sinon, j'aurais dû le faire de façon trop la cueillette et le choix lors de l'exécution de rechercher-remplacer.
- Pour tous les autres modèles qui dépendent de votre modèle via les clés étrangères, les autres tables de clé étrangère de la colonne noms seront tirés de l'original de votre nom de modèle. Ainsi, vous aurez également besoin de faire quelques rename_column appels sur ces modèles dépendants. Par exemple, j'ai dû renommer le "merchant_sign' colonne 'business_id' dans diverses tables de jointure (pour has_and_belongs_to_many relation) et d'autres tables dépendantes (normal has_one et has_many relations). Sinon j'aurais fini avec des colonnes comme " business_stat.merchant_sign' pointage 'entreprise.id". Voici une bonne réponse en faisant de la colonne de renomme.
- Lorsque grepping, n'oubliez pas de recherche pour le singulier, le pluriel, en majuscule, minuscules, et même des MAJUSCULES (ce qui peut se produire dans les commentaires) les versions de vos chaînes.
- Il est préférable de rechercher des versions au pluriel) d'abord, puis singulier. Que ainsi, si vous avez un pluriel irrégulier - comme dans mon commerçants :: les entreprises exemple - vous pouvez obtenir toutes les les pluriels irréguliers correcte. Sinon vous pouvez vous retrouver avec, par exemple, 'businesss' (3 s) comme un état intermédiaire, entraînant encore plus de recherche et remplacement.
- Ne pas aveuglément remplacer chaque occurrence. Si votre modèle de noms entrent en collision commune termes de programmation, avec des valeurs dans d'autres modèles, ou avec le contenu textuel de votre point de vue, vous pouvez finir par être trop trop empressé. Dans mon exemple, j'ai voulu changer mon nom de modèle de "Business", mais toujours se référer à eux comme "marchands" dans le contenu de mon INTERFACE. J'ai également eu un 'marchand' rôle pour mes utilisateurs dans french CanCan - c'était la confusion entre le commerçant et le rôle de modèle de commerce qui m'a amené à renommer le modèle en premier lieu.
Vous avez également besoin de remplacer votre index:
class RenameOldTableToNewTable< ActiveRecord:Migration
def self.up
remove_index :old_table_name, :column_name
rename_table :old_table_name, :new_table_name
add_index :new_table_name, :column_name
end
def self.down
remove_index :new_table_name, :column_name
rename_table :new_table_name, :old_table_name
add_index :old_table_name, :column_name
end
end
Et de renommer vos fichiers etc, manuellement comme d'autres réponses ici de décrire.
Voir: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Assurez-vous que vous pouvez reprendre et rouler vers l'avant après l'écriture de cette migration. Il peut être délicat si vous obtenez quelque chose de mal et coincé avec une migration qui tente de l'effet de quelque chose qui n'existe plus. Meilleur trash de l'ensemble de la base de données et de recommencer si vous ne pouvez pas restaurer. Alors, soyez conscient que vous pourriez avoir besoin de quelque chose en retour.
Aussi: vérifier schema_db pour tout les noms de colonne dans d'autres tables définies par un has_ ou belongs_to ou quelque chose. Vous aurez probablement besoin de modifier ceux qui sont trop.
Et enfin, faire cela sans un test de régression suite serait de noix.