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

StackOverflow https://stackoverflow.com/questions/887246

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top