2012-02-15 19 views

Odpowiedz

78

Spróbuj change_column:

change_column :table_name, :column_name, :column_type, null: false 
+12

Uważaj na to podejście - jeśli masz inne atrybuty dotyczące tej kolumny (na przykład ograniczenie ': limit'), powinieneś powtórzyć te atrybuty podczas używania' change_column', inaczej zostaną utracone. Z tego powodu wolę używać 'change_column_null' –

+0

Zauważ, że generuje to' IrreversibleMigration', która może nie być tym, czego potrzebujesz. –

+0

@NicNilov, czy mówisz o odpowiedzi, czy o komentarzu Nathana Wallace'a? – Mark

184

Można również użyć change_column_null:

change_column_null :table_name, :column_name, false 
+5

Najczystsza odpowiedź! –

+1

Musiałem to zmienić na kilka kolumn i to nie wymaga określenia typu kolumny dla każdej kolumny, o wiele lepiej! – Dorian

+3

Działa również dla Railsów 4+ – daniel

6

1) PIERWSZA: Dodaj kolumnę z wartością domyślną

2) Następnie: Usunięcie wartości domyślnej

add_column :orders, :items, :integer, null: false, default: 0 
change_column :orders, :items, :integer, default: nil 
+0

To jest poprawne rozwiązanie, gdy musisz dodać nową kolumnę, która nie ma wartości null, musisz najpierw zdefiniować, że ma ona wartość domyślną, ponieważ SQLLite będzie narzekać (nie może dodać kolumny NOT NULL z wartością domyślną NULL), a następnie ją usunąć! – Mil4n