次のschema.rb
が与えられた場合:
create_table "people", force: true do |t|
t.string "name", null: false
t.integer "age"
t.integer "height"
t.string "email"
t.boolean "married", default: false
t.text "bio"
t.integer "fav_number"
t.decimal "lucky_num", precision: 2, scale: 2
t.datetime "birthday"
t.datetime "created_at"
t.datetime "updated_at"
end
null: false
のname
デフォルト値を削除したいです。 change_column_default
で個別の移行を実行しようとしましたが、schema.rb
には影響がありませんでした。助言がありますか?
docs から:
def up
change_column_default :table_name, :status, 0
end
def down
change_column_default :table_name, :status, nil
end
「up」関数は、db:migrateを実行すると確実にジョブを実行します。
しかし、将来的には、ロールバックなど、場合によっては、この特定の移行を元に戻す機能が必要になる可能性があります。
def up
change_column_null :people, :name, true
end
def down
change_column_null :people, :name, false
end
列のデフォルト値を変更するのではなく、NOT NULL制約を削除してnull値を許可しようとしているようです(つまり、「null:false」からデフォルトの「null:true」に変更します)。その場合は、 change_column_null を使用できます。
class ChangeNameNull < ActiveRecord::Migration
def change
change_column_null :people, :name, true
end
end
編集1:-誤字を修正
def change
change_column_null(:users, :admin, false, <put a default value here> )
# change_column(:users, :admin, :string, :default => "")
end
NULLを許可しないようにNULL値を含む列を変更すると、問題が発生します。これはまさに開発セットアップで問題なく動作し、[〜#〜] live [〜#〜]プロダクションにデプロイしようとするとクラッシュするタイプのコードです。最初にNULL値を有効な値に変更し、thenNULLを許可しないでください。 change_column_null
の4番目の値はまさにそれを行います。詳細については documentation をご覧ください。
また、新しいオブジェクトを作成するたびにフィールドの値を指定する必要がないように、通常はフィールドにデフォルト値を設定することを好みます。それを行うためにコメントアウトされたコードも含めました。