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


190

次の例のように、列のデフォルト設定をセットアップするマイグレーションがRailsにあるという問題があります。

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

後のマイグレーションでそのデフォルト設定をドロップしたい場合、railsマイグレーションを使用してどうすればよいですか?

私の現在の回避策は、次のように、rails移行でカスタムSQLコマンドを実行することです。

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

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

回答:


387

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

7
postgresでは、これは実際にはCHARACTER VARYING列のデフォルトを削除せず、単にに設定しNULL::character varyingます。
Attila O.

8
最近のバージョンでは、リバーシブルにすることができます。例: change_column_default(:table_name, :column_name, from: nil, to: false)
マーク

1
@AttilaO。実行ALTER TABLE table_name ALTER COLUMN type DROP DEFAULTに成功したので、設定する必要はないNULLと思います。
イーライローズ-REINSTATE MONICA 2017

参考までに、@ Markが言及している可逆バージョンはRails 5以降で追加されたようです。そのため、それより下のものは使用できなくなります。
Joshua Pinter

23

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

change_column_default(table_name, column_name, default)

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

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

ありがとう!私は自分でドキュメントにこのヒントを見つけられませんでした!将来のバージョンのRailsでは、デフォルト値をマイグレーションにドロップすることを期待しています。
ウルフォヴィッチ2009年

1
これは、Rails 3.1.0のcfr以降、もう当てはまりません。apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/...
非対称の

14

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

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

受け入れられたものは同じことを述べているので、私はこの回答に付加価値はありません。
Mosselman 2012

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.