Міграція рейків: скасувати налаштування за замовчуванням для стовпця


190

У мене проблема, що у мене міграція в 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

Але мені не подобається такий підхід, тому що я зараз залежу від того, як базова база даних інтерпретує цю команду. У разі зміни бази даних цей запит може більше не працювати, і міграція буде порушена. Отже, чи існує спосіб виразити скасування налаштування за замовчуванням для стовпця в рейках?

Відповіді:


387

Рейки 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

7
У postgres це фактично не знизить типовий для CHARACTER VARYINGстовпців, просто встановіть його NULL::character varying.
Аттіла О.

8
В останніх версіях ви можете зробити її оборотною. Наприклад: change_column_default(:table_name, :column_name, from: nil, to: false)
Марк

1
@AttilaO Я мав успіх у керуванні ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT, я не мушу його встановлювати NULL.
Eli Rose - ВІДНОВЛЕННЯ МОНИЦИ

FYI, це виглядає як зворотна версія, яку @Mark згадує, була додана в Rails 5+, тому нічого, що нижче цього, ви не зможете використовувати.
Джошуа Пінтер

23

Схоже, ви робите все правильно зі своїм "Execute", як вказують документи:

change_column_default(table_name, column_name, default)

Встановлює нове значення за замовчуванням для стовпця. Якщо ви хочете встановити значення за замовчуванням на NULL, вам не пощастило. Вам потрібно DatabaseStatements # виконати відповідний оператор SQL самостійно. Приклади

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

Дякую! Я не знайшов цього натяку в документах сам! Вони сподіваються, що вони вкладаються до перенесення значень за замовчуванням у міграцію у майбутніх версіях рейок.
wulfovitch


14

Наступний фрагмент я використовую для створення NULLстовпців NOT NULL, але пропускаю DEFAULTна рівні схеми:

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

Я не бачу додаткової цінності у цій відповіді, оскільки прийнята заявляє те саме.
Моссельман

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.