J'ai un modèle et une table dont je n'ai plus besoin dans mon application, je pourrais les laisser là mais je voudrais les supprimer pour garder les choses en ordre.
J'essaie de trouver la meilleure façon de les supprimer sans déconner avec mes migrations & db/fichiers schema.rb et tout effet secondaire que cela pourrait avoir sur mon environnement de production, mon application est sur Heroku. J'utilise PostgreSQL sur ma machine locale et Heroku.
Jusqu'à présent, j'ai trouvé deux façons de le faire, mais je ne sais pas quelle est la meilleure méthode/Rails way?
J'ai pensé à entrer dans ma base de données et à supprimer la table, puis à détruire le modèle.
Rails db
DROP TABLE table_name
\q
Rails destroy model model_name
Si je fais cela, qu'adviendra-t-il des migrations que j'ai pour ce modèle/table? J'ai deux migrations pour ce modèle, un timestamp_create_modelname & un nom add_attribute_to_table.
Cette méthode mettra-t-elle également à jour le fichier db/schema.rb ?
Lorsque je pousse l'application sur Heroku, je soupçonne que le modèle sera supprimé, mais la table restera en place, y a-t-il une commande heroku pour supprimer une table.
Une autre façon dont j'ai lu était de générer une nouvelle migration pour supprimer la table, puis détruire le modèle.
Rails generate migration drop_tablename
puis mettez à jour le fichier ci-dessous:
db/migrate/timestamp_drop_tablename (mis à jour en réponse à la réponse de Dan Wich ci-dessous)
class DropTablename < ActiveRecord::Migration
def up
drop_table :tablename
end
def down
create_table :tablename do |t|
t.string :table_column
t.references :anothertable
t.timestamps
end
add_index :tablenames, :anothertable_id
end
end
puis dans le terminal:
rake db:migrate
Rails destroy model model_name
rake db:migrate
git add .
git commit -m "removed table/model_name"
git Push heroku master
heroku run rake db:migrate
heroku restart
Cela semble être la meilleure méthode, mais qu'advient-il des anciens fichiers de migration? Vont-ils rester et mettre à jour db/shema chaque fois que j'exécute rake db: migrer uniquement pour être remplacé par db/migrate/timestamp_drop_tablename?
Je suis heureux d'expérimenter la deuxième méthode, mais j'aimerais que quelqu'un avec quelqu'un d'expérience ait son mot à dire et me dise les Rails façons de le faire.
La deuxième méthode est le moyen idéal pour gérer cela: vos fichiers de migration sont censés représenter comment votre base de données a changé au fil du temps. Les anciens fichiers de migration resteront dans votre projet (au cas où, par hypothèse, vous vouliez revenir à une version plus ancienne), mais Rails ne les exécutera pas lorsque vous rake db:migrate
car il sait qu'ils ont déjà été exécutés (sur la base des données de la table schema_migrations de la base de données).
Votre schéma.rb ne sera mis à jour qu'une seule fois pour indiquer que votre base de données ne contient plus cette table.
Un petit tweak mineur dans votre code: votre fichier de migration doit supprimer le tableau dans la méthode up
, et idéalement le recréer dans la méthode down
. Le "up" signifie que votre migration supprime la table pour avancer dans le temps, et si la migration est annulée, la méthode down
sera exécutée.
Je sais que c'est un vieux fil. Plus souvent qu'autrement, vous souhaitez supprimer non seulement le modèle, mais également les itinéraires, le contrôleur et les vues associés à ce modèle. Pour ce faire, exécutez ces
Rails g migration DropYourModel
Rails destroy scaffold YourModelName
Modifiez votre fichier de migration en drop_table
puis exécutez
rake db:migrate
Si le modèle se trouve être défini dans un espace de noms, par exemple admins
, remplacez la première commande par
Rails destroy scaffold admins/YourModelName