マイグレーションをレール:列のデフォルト設定を元に戻します
-
23-08-2019 - |
質問
私は、この例のように、列のデフォルト設定を設定Railsの中に移行を持っていること、問題を持っています:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
私は後で移行にそのデフォルト設定をドロップしたい、と仮定し、私はどのように行うのか、そのレールの移行を使用して?
私の現在の回避策は、このように、レールの移行におけるカスタムSQLコマンドの実行、次のとおりです。
def self.up
execute 'alter table column_name alter bought_at drop default'
end
しかし、私は今、基礎となるデータベースには、このコマンドを解釈する方法に依存していますので、私は、このアプローチが好きではありません。データベースの変更の場合には、このクエリは、おそらくもう動作しない可能性がありますし、移行が壊れてしまいます。だから、レール内の列のデフォルト設定のアンドゥを表現する方法はありますか?
解決
5 +
をレールdef change
change_column_default( :table_name, :column_name, from: nil, to: false )
end
レール3,3とレール4
def up
change_column_default( :table_name, :column_name, nil )
end
def down
change_column_default( :table_name, :column_name, false )
end
他のヒント
は次のようにのサウンドドキュメントが指摘するよう、あなたは、あなたの「実行」で正しいことをやってます:
change_column_default(table_name, column_name, default)
列の新しいデフォルト値を設定します。 デフォルト値を設定する場合の NULLに、あなたは運が悪いです。あなたは必要とします DatabaseStatementsへ#実行 適切なSQL文を自分で。を 例
change_column_default(:suppliers, :qualification, 'new') change_column_default(:accounts, :authorized, 1)
私はNULL
の列がNOT NULL
にするために使用しますが、スキーマ・レベルでDEFAULT
をスキップし、次のスニペットます:
def self.up
change_column :table, :column, :string, :null => false, :default => ""
change_column_default(:table, :column, nil)
end
レール4
change_column :courses, :name, :string, limit: 100, null: false
所属していません StackOverflow