Ответ 1
В docs:
def up
change_column_default :table_name, :status, 0
end
def down
change_column_default :table_name, :status, nil
end
Учитывая следующее 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
. Любые предложения?
В docs:
def up
change_column_default :table_name, :status, 0
end
def down
change_column_default :table_name, :status, nil
end
Функция "вверх", безусловно, выполнит работу, когда вы выполните db: migrate.
Но в будущем, в некоторых случаях, например откате, вы можете захотеть отменить эту конкретную миграцию.
def up
change_column_null :people, :name, true
end
def down
change_column_null :people, :name, false
end
Похоже, вы не пытаетесь изменить значение по умолчанию для столбца, а скорее, чтобы удалить ограничение NOT 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 на что-то действительное, а затем запретить NULL. Четвертое значение в change_column_null
делает именно это. Подробнее см. .
Кроме того, я обычно предпочитаю устанавливать значение по умолчанию для поля, поэтому мне не нужно указывать значение поля каждый раз, когда я создаю новый объект. Я также включил прокомментированный код, чтобы сделать это.