Antworten:
remove_column :table_name, :column_name
Zum Beispiel:
remove_column :users, :hobby
würde die Hobby-Spalte aus der Benutzertabelle entfernen.
remove_column :table_name, :column_name, :type, :options
innerhalb der change
Methode verwenden, da die Migration möglich ist, wenn Sie den Typ angeben, der zurückgesetzt werden soll. Aus der Dokumentation: Die type
und options
Parameter , falls vorhanden ignoriert. Es kann hilfreich sein, diese in der change
Methode einer Migration anzugeben, damit sie zurückgesetzt werden kann. In diesem Fall type
und options
wird von add_column verwendet.
change
Methode entfernen , jedoch nur, wenn Sie den Spaltentyp angeben. ZB remove_column, :table_name, :column_name, :column_type
. Andernfalls wird beim Versuch, die Migration auszuführen, die folgende Fehlermeldung angezeigt:remove_column is only reversible if given a type
Für ältere Versionen von Rails
ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype
Für Schienen 3 und höher
rails generate migration RemoveFieldNameFromTableName field_name:datatype
rails g migration remove_field_name_from_table_name field_name:datatype
funktioniert auch
AddXXXtoTTT
eine RemoveXXXFromTTT
Liste mit weißem Abstand von Dateiname: Datentyp folgen kann und die entsprechenden Anweisungen add_column und remove_column erstellt werden: Entfernt rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integer
zwei Attribute mithilfe einer einzelnen Migration. Beachten Sie auch , dass remove_column
nicht unterstützt von change
Verfahren, so dass Sie beide schreiben müssen up
und down
.
change
. Rollback funktioniert wie es sollte.
change
Methode verwenden, die zurückgesetzt werden kann *, müssen Sie den Datentyp (und alle anderen Feldmodifikatoren) angeben. Wenn Sie diese Migration zurücksetzen, kann das Feld korrekt neu erstellt werden. * Wenn ich "Zurückgesetzt" sage, bedeutet dies natürlich, dass Daten aus dieser Spalte verloren gehen.
Rails 4 wurde aktualisiert, sodass die Änderungsmethode bei der Migration zum Löschen einer Spalte verwendet werden kann und die Migration erfolgreich zurückgesetzt wird. Bitte lesen Sie die folgende Warnung für Rails 3-Anwendungen:
Schienen 3 Warnung
Bitte beachten Sie Folgendes, wenn Sie diesen Befehl verwenden:
rails generate migration RemoveFieldNameFromTableName field_name:datatype
Die generierte Migration sieht ungefähr so aus:
def up
remove_column :table_name, :field_name
end
def down
add_column :table_name, :field_name, :datatype
end
Stellen Sie sicher, dass Sie die Änderungsmethode nicht verwenden, wenn Sie Spalten aus einer Datenbanktabelle entfernen (Beispiel für das, was Sie in der Migrationsdatei in Rails 3-Apps nicht möchten):
def change
remove_column :table_name, :field_name
end
Die Änderungsmethode in Rails 3 ist nicht klug, wenn es um remove_column geht, sodass Sie diese Migration nicht rückgängig machen können.
change
Methode verwenden, wird der rake db:rollback
Befehl fehlerhaft ausgegeben . rake db:rollback
ist im Grunde das Gegenteil von rake db:migrate
. Dieser Fehler wurde in Rails 4 behoben :)
In einer Rails4-App ist es möglich, die Änderungsmethode auch zum Entfernen von Spalten zu verwenden. Der dritte Parameter ist der Datentyp und im optionalen vierten können Sie Optionen angeben. Es ist etwas versteckt im Abschnitt 'Verfügbare Transformationen' in der Dokumentation .
class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end
Es gibt zwei gute Möglichkeiten, dies zu tun:
Sie können remove_column einfach wie folgt verwenden:
remove_column :users, :first_name
Dies ist in Ordnung, wenn Sie nur eine einzige Änderung an Ihrem Schema vornehmen müssen.
Sie können dies auch mit einem change_table-Block tun, wie folgt:
change_table :users do |t|
t.remove :first_name
end
Ich bevorzuge dies, da ich es besser lesbar finde und Sie mehrere Änderungen gleichzeitig vornehmen können.
Hier ist die vollständige Liste der unterstützten change_table-Methoden:
http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
In Rails 5 können Sie diesen Befehl im Terminal verwenden:
rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE
So entfernen Sie beispielsweise die Spalte access_level (Zeichenfolge) von Tabellenbenutzern:
rails generate migration remove_access_level_from_users access_level:string
und dann ausführen:
rake db:migrate
Generieren Sie eine Migration, um eine Spalte so zu entfernen, dass sie bei einer Migration ( rake db:migrate
) die Spalte löschen sollte . Und es sollte eine Spalte zurück hinzufügen, wenn diese Migration zurückgesetzt wird ( rake db:rollback
).
Die Syntax:
remove_column: table_name ,: column_name ,: type
Entfernt die Spalte und fügt die Spalte zurück, wenn die Migration zurückgesetzt wird.
Beispiel:
remove_column :users, :last_name, :string
Hinweis : Wenn Sie den Datentyp überspringen , wird die Spalte bei der Migration erfolgreich entfernt. Wenn Sie die Migration jedoch zurücksetzen , wird ein Fehler ausgegeben .
Führen Sie den folgenden Befehl in Ihrem Terminal aus:
rails generate migration remove_fieldname_from_tablename fieldname:fieldtype
Hinweis: Der Tabellenname sollte gemäß der Schienenkonvention im Plural vorliegen.
Beispiel:
In meinem Fall möchte ich die accepted
Spalte (einen booleschen Wert) aus der quotes
Tabelle entfernen :
rails g migration RemoveAcceptedFromQuotes accepted:boolean
Weitere Informationen zum Hinzufügen / Entfernen von Feldern zu einer Tabelle finden Sie in der Dokumentation zu : einer Konvention:
Es gibt eine spezielle syntaktische Verknüpfung zum Generieren von Migrationen, mit denen Felder zu einer Tabelle hinzugefügt werden.
Rails generieren Migration add_fieldname_to_tablename fieldname: fieldtype
# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
# with rails 5.2 you don't need to add a separate "up" and "down" method.
def change
remove_column :quotes, :accepted, :boolean
end
end
rake db:migrate
.... und dann geht es los zu den Rennen!
rails db:migrate
Spalten für RAILS 5 App entfernen
rails g migration Remove<Anything>From<TableName> [columnName:type]
Der obige Befehl generiert eine Migrationsdatei im db/migrate
Verzeichnis. Snippet Blow ist eine der Spalten aus dem Tabellenbeispiel entfernen, die vom Rails-Generator generiert wurden.
class RemoveAgeFromUsers < ActiveRecord::Migration
def up
remove_column :users, :age
end
def down
add_column :users, :age, :integer
end
end
Ich habe auch eine Kurzanleitung für Rails erstellt, die hier zu finden ist .
Sie können Folgendes versuchen:
remove_column :table_name, :column_name
rails g migration RemoveXColumnFromY column_name:data_type
X = Spaltenname
Y = Tabellenname
BEARBEITEN
Geändert RemoveXColumnToY
zu RemoveXColumnFromY
gemäß Kommentar - bietet mehr Klarheit darüber, was die Migration tatsächlich tut.
Geben Sie den folgenden Befehl ein, der in der Migrationsdatei selbst hinzugefügt wird
rails g migration RemoveColumnFromModel
Nachdem Sie den obigen Befehl ausgeführt haben, können Sie überprüfen, ob die Migrationsdatei remove_column Code dort selbst hinzugefügt werden muss
Migrieren Sie dann die Datenbank
rake db:migrate
remove_column
Mit der change
Methode in können Sie die Spalte aus der Tabelle löschen.
class RemoveColumn < ActiveRecord::Migration
def change
remove_column :table_name, :column_name, :data_type
end
end
Klicken Sie auf diesen Link, um eine vollständige Referenz zu erhalten: http://guides.rubyonrails.org/active_record_migrations.html
Zum Entfernen der Spalte aus der Tabelle in nur 3 einfachen Schritten wie folgt:
rails g migration remove_column_from_table_name
Nach dem Ausführen dieses Befehls in Terminal wird eine Datei erstellt, die mit diesem Namen und Zeitstempel erstellt wurde (remove_column from_table_name).
Dann gehen Sie zu dieser Datei.
Innerhalb der Datei müssen Sie schreiben
remove_column :table_name, :column_name
Zum Schluss zur Konsole gehen und dann tun
rake db:migrate
Hier ist noch einer von der Schienenkonsole
ActiveRecord::Migration.remove_column(:table_name, :column_name)
Durch
remove_column :table_name, :column_name
in einer Migrationsdatei
Sie können eine Spalte direkt in einer Rails-Konsole entfernen, indem Sie Folgendes eingeben:
ActiveRecord::Base.remove_column :table_name, :column_name
Mach das so;
rails g migration RemoveColumnNameFromTables column_name:type
Dh rails g migration RemoveTitleFromPosts title:string
Auf jeden Fall sollten Sie auch Ausfallzeiten berücksichtigen, da ActiveRecord zur Laufzeit Datenbankspalten zwischenspeichert. Wenn Sie also eine Spalte löschen, kann dies zu Ausnahmen führen, bis Ihre App neu gestartet wird.
Ref: Starke Migration
Sie können einfach die Spalte entfernen
remove_column :table_name, :column_name
Zum Beispiel,
remove_column :posts, :comment
up
und außerhalb derdown
Methoden tunchange
, wie in der Antwort von @Powers erläutert.