2009-05-20 2 views
185

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

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 

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

ответ

375

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

+7

В postgres это фактически не уменьшит значение по умолчанию для столбцов «CHARACTER VARYING», просто установите для него значение «NULL :: character» '. –

+7

В более поздних версиях вы можете сделать его обратимым. Например: 'change_column_default (: table_name,: column_name, from: nil, to: false)' – Mark

+1

@AttilaO. У меня был успех с запуском 'ALTER TABLE table_name ALTER COLUMN типа DROP DEFAULT', нет необходимости устанавливать его в' NULL', я думаю. –

22

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

change_column_default(table_name, column_name, default) 

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

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

Спасибо! Я не нашел этого намека на документы сам! Надеемся, что они построят в снижении значений по умолчанию в миграциях в будущих версиях рельсов. – wulfovitch

+1

Это не так, как у Rails 3.1.0, cfr. http://apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default – asymmetric

14

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

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

Я не вижу добавленной стоимости в этом ответе, так как принятая заявляет то же самое. – Mosselman

+4

Это на самом деле тот, который помог мне больше всего, так как он дал пример использования ... – rogerdpack

-3

Rails 4

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

Этот добавляет ограничение NOT NULL, это не имеет никакого отношения к DEFAULT – Extrapolator

+0

не имеет ничего общего с DEFAULT +1 –

Смежные вопросы