Подтвердить что ты не робот

Rails Migrations: Проверить существование и продолжить работу?

Я делал такие вещи в моих миграциях:

add_column :statuses, :hold_reason, :string rescue puts "column already added"

но оказывается, что , хотя это работает для SQLite, оно не работает для PostgreSQL. Кажется, что если add_column взорвется, , даже если исключение будет обнаружено,, транзакция будет мертвой, и поэтому миграция не сможет выполнить какую-либо дополнительную работу.

Есть ли не-DB sepecific способы проверки наличия столбца или таблицы? В противном случае, есть ли способ, чтобы мой блок спасения действительно работал?

4b9b3361

Ответ 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" )