Миграция рельсов:Отменить настройку по умолчанию для столбца
-
23-08-2019 - |
Вопрос
У меня проблема в том, что у меня есть миграция в Rails, которая устанавливает настройку по умолчанию для столбца, как в этом примере:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
Предположим, я хотел бы отказаться от настроек по умолчанию при более поздней миграции, как мне это сделать с помощью rails migrations?
Мой текущий обходной путь - это выполнение пользовательской команды sql при миграции rails, например:
def self.up
execute 'alter table column_name alter bought_at drop default'
end
Но мне не нравится этот подход, потому что теперь я завишу от того, как базовая база данных интерпретирует эту команду.В случае изменения базы данных этот запрос, возможно, больше не будет работать, и миграция будет прервана.Итак, есть ли способ выразить отмену настройки по умолчанию для столбца в rails?
Решение
Рельсы 5+
def change
change_column_default( :table_name, :column_name, from: nil, to: false )
end
Рельсы 3 и рельсы 4
def up
change_column_default( :table_name, :column_name, nil )
end
def down
change_column_default( :table_name, :column_name, false )
end
Другие советы
Звуки как будто вы поступаете правильно со своим 'execute', как указано в документах:
change_column_default(table_name, column_name, default)
Задает новое значение по умолчанию для столбца. Если вы хотите установить значение по умолчанию равным NULL, вам не повезло.Вам нужно для DatabaseStatements#выполнить соответствующую инструкцию SQL самостоятельно. Примеры
change_column_default(:suppliers, :qualification, 'new') change_column_default(:accounts, :authorized, 1)
Следующий фрагмент текста, который я использую, чтобы сделать NULL
столбцы NOT NULL
, но пропустить DEFAULT
на уровне схемы:
def self.up
change_column :table, :column, :string, :null => false, :default => ""
change_column_default(:table, :column, nil)
end
Рельсы 4
change_column :courses, :name, :string, limit: 100, null: false