Подтвердить что ты не робот

Rails 4: Как изменить значение по умолчанию для столбца таблицы с переносом?

Учитывая следующее 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

Я хотел бы удалить значение name по умолчанию null: false. Я попытался выполнить отдельную миграцию с помощью change_column_default, но это не повлияло на schema.rb. Любые предложения?

4b9b3361

Ответ 1

В docs:

  def up
    change_column_default :table_name, :status, 0
  end

  def down
    change_column_default :table_name, :status, nil
  end

Ответ 2

Функция "вверх", безусловно, выполнит работу, когда вы выполните db: migrate.
Но в будущем, в некоторых случаях, например откате, вы можете захотеть отменить эту конкретную миграцию.

def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end

Ответ 3

Похоже, вы не пытаетесь изменить значение по умолчанию для столбца, а скорее, чтобы удалить ограничение NOT NULL и разрешить нулевые значения (т.е. изменить с "null: false" на значение по умолчанию "null: true" ), В этом случае вы можете использовать change_column_null:

class ChangeNameNull < ActiveRecord::Migration
  def change
    change_column_null :people, :name, true
  end
end

Изменить 1: - Исправлена ​​опечатка

Ответ 4

def change
  change_column_null(:users, :admin, false, <put a default value here> )
  # change_column(:users, :admin, :string, :default => "")
end

Изменение столбца с NULL-значениями в нем, чтобы не допускать NULL, вызовет проблемы. Это именно тот тип кода, который будет хорошо работать в вашей настройке разработки, а затем выйдет из строя, когда вы попытаетесь развернуть его в своем режиме LIVE. Вы должны сначала изменить значения NULL на что-то действительное, а затем запретить NULL. Четвертое значение в change_column_null делает именно это. Подробнее см. .

Кроме того, я обычно предпочитаю устанавливать значение по умолчанию для поля, поэтому мне не нужно указывать значение поля каждый раз, когда я создаю новый объект. Я также включил прокомментированный код, чтобы сделать это.