191

次の例のように、列のデフォルト設定を設定するRailsでの移行があるという問題があります。

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

後の移行でそのデフォルト設定を削除したいとします。Rails 移行を使用してそれを行うにはどうすればよいですか?

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

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

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

4

4 に答える 4

388

レール 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
于 2009-11-17T02:36:11.313 に答える
23

ドキュメントが指摘しているように、「実行」で正しいことをしているように聞こえます。

change_column_default(table_name, column_name, default)

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

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)
于 2009-05-20T12:28:35.533 に答える
14

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

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end
于 2010-04-06T05:10:20.837 に答える
-3

レール4

change_column :courses, :name, :string, limit: 100, null: false
于 2013-12-09T07:44:32.043 に答える