Rails 4: удалить ограничение not 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

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


person gabethegrape    schedule 16.04.2014    source источник
comment
Это уже в производстве? В противном случае вы можете просто откатиться и вручную удалить значение по умолчанию.   -  person rails4guides.com    schedule 16.04.2014
comment
@ rails4guides.com вот чем я закончил. Я подумал, что есть способ сделать это лучше.   -  person gabethegrape    schedule 17.04.2014
comment
возможный дубликат Правильный способ установки значений по умолчанию в Rails   -  person mahemoff    schedule 23.09.2014


Ответы (4)


Из документов:

  def up
    change_column_default :table_name, :status, 0
  end

  def down
    change_column_default :table_name, :status, nil
  end
person luigi7up    schedule 03.12.2014
comment
Я думаю, вы хотели написать :table_name вместо :column_name для этого первого значения. change_column_default(table_name, column_name, default) public - person trueinViso; 18.03.2015

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

def up
  change_column_null :people, :name, true
end

def down
  change_column_null :people, :name, false
end
person ran632    schedule 19.11.2015
comment
Хотя этот код может ответить на вопрос, было бы лучше объяснить, как он решает проблему и зачем его использовать. Ответы, содержащие только код, в конечном итоге бесполезны. - person Tobias Liefke; 19.11.2015
comment
Можете ли вы также добавить пояснение, в чем разница между этот ответ? - person Tobias Liefke; 22.11.2015
comment
этот ответ относится к изменению значения столбца по умолчанию. мой ответ устанавливает, допускает ли этот столбец нулевое значение или нет. - person ran632; 23.11.2015

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

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

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

person ddebruler    schedule 17.01.2015

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 делает именно это. Дополнительные сведения см. В документации.

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

person Rick Smith    schedule 02.09.2015