Antworten:
So sollten Sie es machen:
change_column :users, :admin, :boolean, :default => false
Einige Datenbanken, wie z. B. PostgreSQL, aktualisieren das Feld für zuvor erstellte Zeilen jedoch nicht. Stellen Sie daher sicher, dass Sie das Feld auch bei der Migration manuell aktualisieren.
change_column_default :employees, :foreign, false
from:
und to:
wenn Sie möchten, dass es reversibel ist :)
from
und to
wurde in Rails 5+ in diesem Commit hinzugefügt: github.com/rails/rails/pull/20018/files
Verwenden Sie für Rails 4+change_column_default
def change
change_column_default :table, :column, value
end
def change
`add_column: foos ,: name, default:" etwas für vorhandene Werte "` `change_column_default: foos ,: name, default:" "`end
change_column_default :products, :approved, from: true, to: false
- aber es funktioniert auch nicht.
Mit def change
bedeutet, dass Sie Migrationen schreiben sollten, die reversibel sind. Und change_column
ist nicht umkehrbar. Sie können nach oben gehen, aber Sie können nicht nach unten gehen, da dies change_column
irreversibel ist.
Stattdessen, obwohl es ein paar zusätzliche Zeilen sein können, sollten Sie verwenden def up
unddef down
Wenn Sie also eine Spalte ohne Standardwert haben, sollten Sie dies tun, um einen Standardwert hinzuzufügen.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: nil
end
Oder wenn Sie den Standardwert für eine vorhandene Spalte ändern möchten.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: true
end
Ab Rails 4 können Sie keine Migration generieren, um einer Tabelle mit einem Standardwert eine Spalte hinzuzufügen. Mit den folgenden Schritten wird einer vorhandenen Tabelle mit dem Standardwert true oder false eine neue Spalte hinzugefügt.
$ rails generate migration add_columnname_to_tablename columnname:boolean
Mit dem obigen Befehl wird eine neue Spalte in Ihre Tabelle eingefügt.
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
$ rake db:migrate
Ausführen:
rails generate migration add_column_to_table column:boolean
Diese Migration wird generiert:
class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end
Stellen Sie den Standardwert ein, indem Sie Folgendes hinzufügen: Standard => 1
add_column: table ,: column ,: boolean ,: default => 1
Lauf:
Rechen db: migrieren
Key is not present in table error
.
Folgendes können Sie tun:
class Profile < ActiveRecord::Base
before_save :set_default_val
def set_default_val
self.send_updates = 'val' unless self.send_updates
end
end
EDIT: ... aber anscheinend ist das ein Rookie-Fehler!
before_save
up
Block anstatt in einen Block einchange
. Sie können dendown
Block leer lassen. Die Tabelle wird nicht in den ursprünglichen Zustand zurückgesetzt, aber die Migration kann zurückgesetzt werden.