web-dev-qa-db-fra.com

Quelle est la meilleure façon de supprimer une table et de supprimer un modèle dans Rails 3?

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?

Méthode 1

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.

Deuxième méthode

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.

53
Holly

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.

32
Dan Wich

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
13
MichaelZ