Ruby on Rails: как добавить ограничение, отличное от NULL, в существующий столбец с помощью миграции?

131

В моем приложении Rails (3.2) у меня есть куча таблиц в моей базе данных, но я забыл добавить несколько ненулевых ограничений. Я искал в Google, но я не могу найти, как написать миграцию, которая добавляет ненулевое значение в существующий столбец.

ТИА.

Дэвид Робертсон
источник

Ответы:

93

Для Rails 4+ ответ nates (с использованием change_column_null ) лучше.

Pre-Rails 4, попробуйте change_column .

Дэн Вич
источник
25
Будьте осторожны с этим подходом - если у вас были другие атрибуты этого столбца (например, :limitограничение), вам нужно повторить эти атрибуты при использовании change_column, иначе они будут потеряны. По этой причине я предпочитаю использоватьchange_column_null
Натан Уоллес,
Обратите внимание, что это IrreversibleMigrationможет быть не тем, что вам нужно.
Ник Нилов
@NicNilov, ты про ответ ИЛИ комментарий Натана Уоллеса?
Марк
@Mark Я говорил об ответе, извините за недостаточную конкретность.
Ник Нилов
@NicNilov no dw Я действительно так думал, хотя просто хотел перепроверить :)
Марк
275

Вы также можете использовать change_column_null :

change_column_null :table_name, :column_name, false
ягодицы
источник
8
Чистейший ответ!
Джош Клик
1
Мне пришлось изменить его для группы столбцов, и это не требует указания типа столбца для каждого столбца, гораздо лучше!
Дориан
1
Это лучший ответ. В моей базе данных я добавлял нулевое ограничение для столбца с уже существующими нулевыми значениями. change_column не будет обновлять эти значения. Согласно документации, change_column_null имеет необязательное четвертое значение, которое является новым значением для обновления.
Merovex 01
Спасибо за это. Лучший ответ.
Райан Ребо,
1
интересный побочный эффект .... откат миграции установит противоположное значение поля (false -> true). Поэтому, если вы создаете миграцию для нескольких полей, чтобы добавить нулевое ограничение, а некоторые поля УЖЕ имели нулевое ограничение, то откатите миграцию, это УДАЛИТ нулевое ограничение из любого поля, в котором оно уже было.
jpw
10

1) ПЕРВЫЙ: добавить столбец со значением по умолчанию

2) ТО: Удалить значение по умолчанию

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil
rndrfero
источник
2
это правильное решение, когда вам нужно добавить новый столбец, который не является нулевым, вам нужно сначала определить, что он имеет значение по умолчанию, потому что SQLLite будет жаловаться (не может добавить столбец NOT NULL со значением по умолчанию NULL), а затем удалить его!
Милан,
2

Если вы используете его в новом сценарии / схеме создания миграции, вот как мы можем его определить.

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
Манджунатх Редди
источник