web-dev-qa-db-ja.com

移行によって列にデフォルト値を追加する

マイグレーションによって既に存在している列にデフォルト値を追加する方法を教えてください。

私が見つけることができるすべての文書は、列がまだ存在していない場合にそれを行う方法を示していますが、この場合それは存在します。

251
Jon

これを行う方法は次のとおりです。

change_column :users, :admin, :boolean, :default => false

しかし、PostgreSQLのようなデータベースの中には、以前に作成された行のフィールドを更新しないものがあるので、移行時にもフィールドを手動で更新するようにしてください。

327
change_column_default :employees, :foreign, false
175
Gazza

Rails 4 +には、 change_column_default を使用してください。

def change
  change_column_default :table, :column, value
end
102
csi

def changeを使用すると、元に戻すことができる移行を記述する必要があります。そしてchange_columnは元に戻せません。 change_columnは元に戻すことができないため、上がることはできますが下がることはできません。

代わりに、余分な行になるかもしれませんが、def updef downを使うべきです。

したがって、デフォルト値のない列がある場合は、デフォルト値を追加するためにこれを実行する必要があります。

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: nil
end

あるいは、既存の列のデフォルト値を変更したい場合.

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: true
end
44
bfcoder

** Rails 4.X + **

Rails 4では、デフォルト値でテーブルに列を追加するマイグレーションを生成することはできません。次の手順では、デフォルト値trueまたはfalseで既存のテーブルに新しい列を追加します。

1。コマンドラインから移行を実行して新しい列を追加します

$ Rails generate migration add_columnname_to_tablename columnname:boolean

上記のコマンドはあなたのテーブルに新しい列を追加します。

2。作成された新しい移行ファイルを編集して、新しい列の値をTRUE/FALSEに設定します

class AddColumnnameToTablename < ActiveRecord::Migration
  def change
    add_column :table_name, :column_name, :boolean, default: false
  end
end

** 3アプリケーションデータベーステーブルに変更を加えるには、端末**で次のコマンドを実行します。

$ rake db:migrate
33
Praveen George

実行します。

Rails generate migration add_column_to_table column:boolean

それはこの移行を生成します:

class AddColumnToTable < ActiveRecord::Migration
  def change
    add_column :table, :column, :boolean
  end
end

追加してデフォルト値を設定します。default => 1

add_column:table、:column、:boolean、:default => 1

実行します。

レーキdb:migrate

8
axeltaglia