Ich habe bei meinen Migrationen so etwas gemacht:
add_column :statuses, :hold_reason, :string rescue puts "column already added"
Es stellt sich jedoch heraus, dass dies zwar für SQLite funktioniert, für PostgreSQL jedoch nicht . Es scheint, als ob die add_column explodiert, selbst wenn die Ausnahme abgefangen wird, die Transaktion tot ist und die Migration keine zusätzliche Arbeit leisten kann.
Gibt es nicht DB-spezifische Möglichkeiten, um zu überprüfen, ob bereits eine Spalte oder Tabelle vorhanden ist? Wenn das nicht gelingt, gibt es eine Möglichkeit, meinen Rettungsblock wirklich zum Laufen zu bringen?
ruby-on-rails
migration
Dan Rosenstark
quelle
quelle
Antworten:
Ab Rails 3.0 und höher können Sie
column_exists?
überprüfen, ob eine Spalte vorhanden ist.unless column_exists? :statuses, :hold_reason add_column :statuses, :hold_reason, :string end
Es gibt auch eine
table_exists?
Funktion, die bis zu Rails 2.1 zurückreicht.quelle
Oder noch kürzer
add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason
quelle
Für Rails 2.X können Sie das Vorhandensein von Spalten wie folgt überprüfen:
columns("[table-name]").index {|col| col.name == "[column-name]"}
Wenn nil zurückgegeben wird, ist keine solche Spalte vorhanden. Wenn eine Fixnummer zurückgegeben wird, ist die Spalte vorhanden. Natürlich können Sie selektivere Parameter zwischen die setzen,
{...}
wenn Sie eine Spalte nicht nur anhand ihres Namens identifizieren möchten, zum Beispiel:{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil }
(Diese Antwort wurde zuerst veröffentlicht unter Wie schreibe ich bedingte Migrationen in Schienen? )
quelle
add_column :statuses, :hold_reason, :string unless Status.column_names.include?("hold_reason")
quelle