web-dev-qa-db-ja.com

Rails migrations:列のデフォルト設定を元に戻す

私には問題があります。Railsに移行があり、この例のように列のデフォルト設定をセットアップします。

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

後の移行でそのデフォルト設定を削除したい場合、Rails migrations?

私の現在の回避策は、次のようなRails移行でのカスタムsqlコマンドの実行です。

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

しかし、私はこのアプローチが好きではありません。なぜなら、私は今、基になるデータベースがこのコマンドをどのように解釈しているかに依存しているからです。データベースが変更された場合、このクエリはおそらく機能しなくなり、移行は中断されます。だから、レールの列のデフォルト設定の取り消しを表現する方法はありますか?

192
wulfovitch

Rails 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

Rails 3およびRails 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end
387
Jeremy Mack

サウンド あなたの「実行」で正しいことをしているように、ドキュメントが指摘しているように:

change_column_default(table_name, column_name, default)

列の新しいデフォルト値を設定します。 デフォルト値をNULLに設定する場合、運が悪い。 DatabaseStatements#適切なSQLステートメントを自分で実行する必要があります。

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)
23
Serx

NULL列を作成するために使用する次のスニペットNOT NULLが、スキーマレベルでDEFAULTをスキップします。

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end
14
Alex Fortuna