Modifier un type de colonne de Date à DateTime pendant la migration ROR

227

Je dois changer mon type de colonne de date en datetime pour une application que je crée. Je me fiche des données car elles sont toujours en cours de développement.

Comment puis-je faire ceci?

jdog
la source

Réponses:

508

Tout d'abord dans votre terminal:

rails g migration change_date_format_in_my_table

Puis dans votre fichier de migration:

Pour les rails> = 3.2:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end
apnée
la source
27
Vous avez raison, je supposais juste qu'un débutant choisirait la dernière technologie disponible, mais ce n'est bien sûr pas sûr
apneadiving
12
La question est étiquetée "ruby-on-rails-3"
Sucrenoir
2
@Sucrenoir Oui, le tag a été ajouté par apneadiving après avoir répondu.
Jason
10
Si vous vous demandez pourquoi une seule changeméthode n'est pas utilisée à la place des méthodes upet down, c'est parce que la changeméthode ne prend pas en charge la change_columndéfinition de migration .
Dennis
2
Cette réponse n'est que partiellement correcte, vous ne pouvez pas utiliser change_column dans change même sur les rails 4 ou la migration vers le bas ne fonctionnera pas. Vous devez utiliser haut / bas quelle que soit la version des rails.
Alan Peabody
78

De plus, si vous utilisez Rails 3 ou une version plus récente, vous n'avez pas besoin d'utiliser les méthodes upet down. Vous pouvez simplement utiliser change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end
Lee McAlilly
la source
78
La méthode de changement ne fonctionne qu'avec des migrations réversibles. Le code ci-dessus lèverait une exception ActiveRecord :: IrreversibleMigration. Seules les méthodes de api.rubyonrails.org/classes/ActiveRecord/Migration/… doivent être utilisées dans la méthode de changement.
davekaro
3
J'utilise Rails 4 et j'ai déjà fait ce genre de migration. LE CHANGEMENT NE FONCTIONNE PAS! Le commentaire de @ davekaro est correct.
hart
3
Pour Rails 5, c'est la solution correcte et fonctionnelle.
WM
3
Une fois inversé, comment pourrait-il savoir quel est l'ancien type de colonne auquel il devrait revenir?
Andrew Grimm
@AndrewGrimm vous avez raison. Voici ce que je vois lorsque j'essaie d'inverser ma migration:This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
Marklar
42

Dans Rails 3.2 et Rails 4, la réponse populaire de Benjamin a une syntaxe légèrement différente.

Tout d'abord dans votre terminal:

$ rails g migration change_date_format_in_my_table

Puis dans votre fichier de migration:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end
Thomas Klemm
la source
23

Il existe une méthode change_column , il suffit de l'exécuter dans votre migration avec datetime comme nouveau type.

change_column(:my_table, :my_column, :my_new_type)
Nikita Rybak
la source
1
cela préserve-t-il les données d'origine?
BKSpurgeon
1
Oui, conservez les données d'origine
Mauro
1

AFAIK, les migrations sont là pour essayer de remodeler les données qui vous intéressent (c'est-à-dire la production) lorsque vous effectuez des modifications de schéma. Donc, à moins que cela ne soit faux, et puisqu'il a dit qu'il ne se souciait pas des données, pourquoi ne pas simplement modifier le type de colonne dans la migration d'origine de date à datetime et réexécuter la migration? (J'espère que vous avez des tests :)).

fakeleft
la source
2
Vous pouvez potentiellement vous soucier de l'utilisation d'une migration dans un environnement de développement, même si vous ne vous souciez pas des données, si vous travaillez en équipe et que vous souhaitez que votre modification de schéma se propage à tous les autres développeurs de votre équipe.
Jose B
J'ai du mal à voir quel avantage vous offre la migration supplémentaire pour modifier une colonne dans cette situation. Quel est le problème avec la modification de la migration d'origine qui a créé la colonne? Dans les deux cas, chaque membre de l'équipe doit réexécuter toutes les migrations pour obtenir le nouveau schéma.
fakeleft
Si vous utilisez une nouvelle migration, vous pouvez simplement annuler la migration qui a changé le type de colonne. Si vous deviez modifier l'original, vous devrez annuler cette modification et réexécuter les migrations après cela.
jazzpi
C'est en fait une réponse très prudente étant donné qu'il n'y a pas encore de données de production. Pour ceux qui s'inquiètent pour les autres membres de l'équipe, c'est pour ça rake db:migrate:reset.
Ryan McGeary