Миграции Rails: проверить существование и продолжать? - PullRequest
68 голосов
/ 29 октября 2009

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

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

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

Существуют ли какие-либо не относящиеся к БД способы проверки того, существует ли уже столбец или таблица? В противном случае, есть ли способ заставить мой спасательный блок действительно работать?

Ответы [ 4 ]

155 голосов
/ 11 мая 2011

Начиная с Rails 3.0 и выше, вы можете использовать column_exists? для проверки существования столбца.

unless column_exists? :statuses, :hold_reason
  add_column :statuses, :hold_reason, :string
end

Существует также функция table_exists?, которая восходит к Rails 2.1.

6 голосов
/ 19 апреля 2013

или даже короче

add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason
4 голосов
/ 28 марта 2012

Для Rails 2.X вы можете проверить наличие столбцов с помощью следующего:

columns("[table-name]").index {|col| col.name == "[column-name]"}

Если возвращается ноль, такой столбец не существует. Если он возвращает Fixnum, то столбец существует. Естественно, вы можете поместить более селективные параметры между {...}, если хотите идентифицировать столбец не только по его имени, например:

{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil }

(этот ответ впервые опубликован на Как написать условную миграцию в рельсах? )

1 голос
/ 27 марта 2013

add_column :statuses, :hold_reason, :string unless Status.column_names.include?("hold_reason")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...