2010-05-10 3 views
284

Wir haben script/generate migration add_fieldname_to_tablename fieldname:datatype Syntax für das Hinzufügen neuer Spalten zu einem Modell.Schienenmigration für Änderungsspalte

In der gleichen Zeile, haben wir ein Skript/generieren zum Ändern des Datentyps einer Spalte? Oder sollte ich SQL direkt in meine Vanilla-Migration schreiben?

Ich möchte eine Spalte von datetime zu date ändern.

Antwort

478

Ich denke, das sollte funktionieren.

change_column :table_name, :column_name, :date 
+0

ich war eher ein Skript der Hoffnung/Zugweg erzeugen. change_column funktioniert in einer Standalone-Migration einwandfrei – papdel

+13

@b_ayan: Soweit ich weiß, sind die einzigen magischen Wörter in Migrationsnamen "hinzufügen" und "entfernen". –

+0

Sortieren von Schienen noob hier, aber ... Ich verstehe die Antwort, aber nicht die Kommentare zu dieser Antwort. Erläuterungen geschätzt :) –

93

Sie können auch einen Block verwenden, wenn Sie innerhalb einer Tabelle mehrere Spalten ändern müssen.

Beispiel:

change_table :table_name do |t| 
    t.change :column_name, :column_type, {options} 
end 

Siehe API documentation on the Table class für weitere Details.

80

Mir ist nicht bekannt, ob Sie eine Migration von der Befehlszeile aus erstellen können, um all dies zu tun, aber Sie können eine neue Migration erstellen und dann die Migration bearbeiten, um diese Aufgaben auszuführen.

Wenn Tabellenname der Name Ihrer Tabelle ist, Feldname ist der Name Ihres Felds und Sie möchten von einem Datum zu einem anderen Datum wechseln, können Sie eine Migration schreiben, um dies zu tun.

Sie können eine neue Migration erstellen mit:

rails g migration change_data_type_for_fieldname 

dann die Migration bearbeiten change_table zu verwenden:

class ChangeDataTypeForFieldname < ActiveRecord::Migration 
    def self.up 
    change_table :tablename do |t| 
     t.change :fieldname, :date 
    end 
    end 
    def self.down 
    change_table :tablename do |t| 
     t.change :fieldname, :datetime 
    end 
    end 
end 

dann die Migration ausgeführt wird:

rake db:migrate 
23

Wie ich gefunden Die vorherigen Antworten, drei Schritte sind erforderlich, um den Typ einer Spalte zu ändern:

Schritt:

Erzeugen Sie eine neue Migrationsdatei mit diesem Code:

rails g migration sample_name_change_column_type 

Schritt 2:

Zum /db/migrate Ordner und bearbeiten Sie die Migrationsdatei, die Sie gemacht. Es gibt zwei verschiedene Lösungen.

  1. def change 
        change_column(:table_name, :column_name, :new_type) 
    end 
    

2.

def up 
     change_column :table_name, :column_name, :new_type 
    end 

    def down 
     change_column :table_name, :column_name, :old_type 
    end 

Schritt 3:

Vergessen Sie nicht, diesen Befehl zu tun:

rake db:migrate 

ich diese Lösung getestet haben für Rails 4 und es funktioniert gut.

+1

In Schritt 2 wird die erste fehlschlagen nach dem Ausführen von Rake db: rollback, ich empfehle Ihnen, die zweite zu überprüfen – Feuda

+0

Gibt es eine Rails-Konvention, die alles mehr oder weniger beim Erstellen der Migrationsdatei ohne zu gehen, und dann bearbeiten ermöglicht es? – BKSpurgeon

+0

@BKSpurgeon Ja, überprüfen Sie die Dokumentation hier: http://edgeguides.rubyonrails.org/active_record_migrations.html –

0

Eine andere Möglichkeit, Datentyp ändern Migration mit

Schritt 1: Sie müssen die fehlerbehafteten Datentyp Feldname

ex Migration entfernen Verwendung:

rails g migration RemoveFieldNameFromTableName field_name:data_type 

Vergessen Sie nicht, den Datentyp für Ihr Feld

anzugeben

Schritt 2: Jetzt können Sie Feld mit dem richtigen Datentyp

ex hinzufügen:

rails g migration AddFieldNameToTableName field_name:data_type 

Das ist es, jetzt Ihr Tisch mit richtigen Datentyp Feld hinzugefügt wird, glücklicher Rubin Codierung !!

1

erzeugen Nur Migration:

rails g migration change_column_to_new_from_table_name 

aktualisieren Migration wie folgt aus:

class ClassName < ActiveRecord::Migration 
    change_table :table_name do |t| 
     t.change :column_name, :data_type 
    end 
end 

und schließlich

rake db:migrate 
Verwandte Themen