Rails-миграции: отменить настройку по умолчанию для столбца - PullRequest
192 голосов
/ 20 мая 2009

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

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

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

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

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

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

Ответы [ 4 ]

387 голосов
/ 17 ноября 2009

Рельсы 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
23 голосов
/ 20 мая 2009

Звучит , как будто вы делаете правильно с вашим «выполнить», как указывают документы:

change_column_default(table_name, column_name, default)

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

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)
14 голосов
/ 06 апреля 2010

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

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end
0 голосов
/ 09 декабря 2013

Рельсы 4

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