マイグレーションをレール:列のデフォルト設定を元に戻します

StackOverflow https://stackoverflow.com/questions/887246

  •  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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top