Rails Migrations: Проверить существование и продолжить работу?
Я делал такие вещи в моих миграциях:
add_column :statuses, :hold_reason, :string rescue puts "column already added"
но оказывается, что , хотя это работает для SQLite, оно не работает для PostgreSQL. Кажется, что если add_column взорвется, , даже если исключение будет обнаружено,, транзакция будет мертвой, и поэтому миграция не сможет выполнить какую-либо дополнительную работу.
Есть ли не-DB sepecific способы проверки наличия столбца или таблицы? В противном случае, есть ли способ, чтобы мой блок спасения действительно работал?
Ответы
Ответ 1
Как и в случае с Rails 3.0 и более поздними версиями, вы можете использовать column_exists?
, чтобы проверить наличие столбца.
unless column_exists? :statuses, :hold_reason
add_column :statuses, :hold_reason, :string
end
Также существует функция table_exists?
, которая идет еще в Rails 2.1.
Ответ 2
Или даже короче
add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason
Ответ 3
Для Rails 2.X вы можете проверить наличие столбцов со следующим:
columns("[table-name]").index {|col| col.name == "[column-name]"}
Если он возвращает nil, такой столбец не существует. Если он возвращает Fixnum, то столбец существует. Естественно, вы можете установить более селективные параметры между {...}
, если вы хотите идентифицировать столбец больше, чем просто его имя, например:
{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil }
(этот ответ был впервые отправлен на Как написать условные миграции в рельсах?)
Ответ 4
add_column: statuses,: hold_reason,: string, если Status.column_names.include? ( "hold_reason" )