Миграция Rails: Отменить настройку по умолчанию для столбца

У меня проблема, что у меня есть миграция в Rails, которая устанавливает значение по умолчанию для столбца, как этот пример:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

Предположим, я хотел бы отказаться от настроек по умолчанию в более поздней миграции, как это сделать с помощью миграции рельсов?

Моим текущим обходным решением является выполнение пользовательской команды sql в миграции рельсов, например:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

Но мне не нравится этот подход, потому что теперь я зависим от того, как базовая база данных интерпретирует эту команду. В случае изменения базы данных этот запрос, возможно, больше не работает, и миграция будет нарушена. Итак, есть ли способ выразить отмену установки по умолчанию для столбца в рельсах?

Ответ 1

change_column_default(table_name, column_name, nil) также полностью отменяет значение по умолчанию для столбца. Нет необходимости использовать выполнение.

Ответ 2

Звучит так, как будто вы делаете правильную вещь с помощью своего "выполнения" , как указывают документы:

change_column_default(table_name, column_name, default)

Устанавливает новое значение по умолчанию для столбца. Если вы хотите установить значение по умолчанию к NULL, вам не повезло. Тебе нужно to DatabaseStatements # выполнить соответствующий SQL-оператор.Примеры

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)

Ответ 3

Следующий фрагмент, который я использую для создания столбцов NULL NOT NULL, но пропустите DEFAULT на уровне схемы:

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

Ответ 4

Рельсы 4

change_column :courses, :name, :string, limit: 100, null: false