web-dev-qa-db-ja.com

Rails 4:移行でテーブル列から非null制約を削除しますか?

次の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: falsenameデフォルト値を削除したいです。 change_column_defaultで個別の移行を実行しようとしましたが、schema.rbには影響がありませんでした。助言がありますか?

42
gabethegrape

docs から:

  def up
    change_column_default :table_name, :status, 0
  end

  def down
    change_column_default :table_name, :status, nil
  end
70
luigi7up

「up」関数は、db:migrateを実行すると確実にジョブを実行します。
しかし、将来的には、ロールバックなど、場合によっては、この特定の移行を元に戻す機能が必要になる可能性があります。

def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end
14
Ran Galili

列のデフォルト値を変更するのではなく、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:-誤字を修正

8
ddebruler
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 をご覧ください。

また、新しいオブジェクトを作成するたびにフィールドの値を指定する必要がないように、通常はフィールドにデフォルト値を設定することを好みます。それを行うためにコメントアウトされたコードも含めました。

3
Rick Smith