2012-02-15 4 views
95

私のRails(3.2)アプリケーションでは、データベースにたくさんのテーブルがありますが、いくつかのnull以外の制約を追加するのを忘れました。私は周りを探索したが、私はどのように既存の列にnullを追加する移行を記述することができません見つけることができません。Ruby on Rails:マイグレーションを使用して既存の列にnot null制約を追加するにはどうすればよいですか?

TIA。

答えて

78

change_columnをお試しください:

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

この方法に注意してください。 - その列に関する他の属性(たとえば ':limit'制約)がある場合、' change_column'を使用するときにそれらの属性を繰り返す必要があります。そうしないと属性が失われます。この理由から、私は 'change_column_null'を使うことを好みます。 –

+0

これはあなたが望むものではないかもしれない' IrreversibleMigration'を生成することに注意してください。 –

+0

@NicNilovあなたは答え、またはNathan Wallaceのコメントについて話していますか? – Mark

184

ます。またchange_column_nullを使用することができます。

change_column_null :table_name, :column_name, false 
+5

クリーンな答え! –

+1

私はそれを列の束のために変更しなければなりませんでした。これは各列の列の型を指定する必要はありません。 – Dorian

+3

Rails 4 + – daniel

6

1)FIRST:デフォルト値

2でカラムを追加)THEN:デフォルト値を削除

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

これは、NULLでない新しい列を追加する必要がある場合、SQLLiteが(デフォルト値NULLでNOT NULL列を追加できない)ため、デフォルト値を持つことを最初に定義する必要がある場合に、正しい解決策です。 – Mil4n

関連する問題