Ändern Sie während der ROR-Migration einen Spaltentyp von Date in DateTime

227

Ich muss meinen Spaltentyp für eine von mir erstellte App von Datum auf Datum / Uhrzeit ändern. Die Daten sind mir egal, da sie noch entwickelt werden.

Wie kann ich das machen?

jdog
quelle

Antworten:

508

Zuerst in Ihrem Terminal:

rails g migration change_date_format_in_my_table

Dann in Ihrer Migrationsdatei:

Für Schienen> = 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
apneadiving
quelle
27
Sie haben Recht, ich habe nur angenommen, dass ein Anfänger die neueste verfügbare Technologie wählen würde, aber das ist natürlich unsicher
apneadiving
12
Die Frage ist mit "Ruby-on-Rails-3"
Sucrenoir
2
@Sucrenoir Ja, das Tag wurde von apneadiving hinzugefügt, nachdem er geantwortet hat.
Jason
10
Wenn Sie sich fragen, warum changeanstelle der Methoden upund keine einzelne Methode verwendet wird down, liegt dies daran, dass die changeMethode die change_columnMigrationsdefinition nicht unterstützt .
Dennis
2
Diese Antwort ist nur teilweise richtig. Sie können change_column nicht innerhalb von change verwenden, auch wenn Rails 4 oder Down-Migration nicht funktioniert. Sie sollten unabhängig von der Schienenversion Auf / Ab verwenden.
Alan Peabody
78

Wenn Sie Rails 3 oder höher verwenden, müssen Sie die Methoden upund nicht downverwenden. Sie können einfach verwenden change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end
Lee McAlilly
quelle
78
Die Änderungsmethode funktioniert nur bei reversiblen Migrationen. Der obige Code würde eine ActiveRecord :: IrreversibleMigration-Ausnahme auslösen. Für die Änderungsmethode sollten nur Methoden in api.rubyonrails.org/classes/ActiveRecord/Migration/… verwendet werden.
Davekaro
3
Ich verwende Rails 4 und habe diese Art der Migration bereits durchgeführt. ÄNDERUNG FUNKTIONIERT NICHT! @ Davekaros Kommentar ist korrekt.
Harry
3
Für Rails 5 ist dies die richtige und funktionierende Lösung.
WM
3
Woher weiß es beim Umkehren, auf welchen alten Spaltentyp es zurückgesetzt werden soll?
Andrew Grimm
@ AndrewGrimm du bist richtig. Dies ist, was ich sehe, wenn ich versuche, meine Migration umzukehren: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

In Rails 3.2 und Rails 4 ist Benjamins beliebte Antwort eine etwas andere Syntax.

Zuerst in Ihrem Terminal:

$ rails g migration change_date_format_in_my_table

Dann in Ihrer Migrationsdatei:

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
quelle
23

Es gibt eine change_column- Methode. Führen Sie sie einfach in Ihrer Migration mit datetime als neuem Typ aus.

change_column(:my_table, :my_column, :my_new_type)
Nikita Rybak
quelle
1
Bewahrt dies die Originaldaten?
BKSpurgeon
1
Ja, bewahren Sie die Originaldaten auf
Mauro
1

AFAIK, Migrationen dienen dazu, Daten, die Ihnen wichtig sind (dh die Produktion), bei Schemaänderungen umzugestalten. Wenn dies nicht falsch ist und er gesagt hat, dass ihm die Daten egal sind, warum nicht einfach den Spaltentyp in der ursprünglichen Migration von Datum zu Datum / Uhrzeit ändern und die Migration erneut ausführen? (Hoffe du hast Tests :)).

fakeleft
quelle
2
Möglicherweise möchten Sie eine Migration in einer Entwicklungsumgebung verwenden, auch wenn Sie sich nicht für die Daten interessieren, wenn Sie in einem Team arbeiten und möchten, dass Ihre Schemaänderung an alle anderen Entwickler in Ihrem Team weitergegeben wird.
Jose B
Ich habe Probleme zu erkennen, welchen Vorteil die zusätzliche Migration zum Ändern einer Spalte in dieser Situation bietet. Was ist falsch daran, die ursprüngliche Migration zu ändern, mit der die Spalte erstellt wurde? In beiden Fällen muss jedes Teammitglied alle Migrationen erneut ausführen, um das neue Schema zu erhalten.
Fakeleft
Wenn Sie eine neue Migration verwenden, können Sie einfach die Migration rückgängig machen, die den Spaltentyp geändert hat. Wenn Sie das Original bearbeiten würden, müssten Sie diese Bearbeitung zurücksetzen und die Migrationen danach erneut ausführen.
Jazzpi
Dies ist eine sehr umsichtige Antwort, da noch keine Produktionsdaten vorliegen. Für diejenigen, die sich Sorgen um andere Teammitglieder machen, ist dies das Richtige rake db:migrate:reset.
Ryan McGeary