Rails Migrations: Check Existence and Keep Going?
Rails 6.1+:
add_column :statuses, :hold_reason, :string, if_not_exists: true
https://github.com/rails/rails/pull/38352/files
Rails < 6.1:
add_column :statuses, :hold_reason, :string unless column_exists?(:statuses, :hold_reason)
As of Rails 3.0 and later, you can use column_exists?
to check for the existance of a column.
unless column_exists? :statuses, :hold_reason
add_column :statuses, :hold_reason, :string
end
There's also a table_exists?
function, which goes as far back as Rails 2.1.
For Rails 2.X, you can check the existence of columns with the following:
columns("[table-name]").index {|col| col.name == "[column-name]"}
If it returns nil, no such column exists. If it returns a Fixnum, then the column does exist. Naturally, you can put more selective parameters between the {...}
if you want to identify a column by more than just its name, for example:
{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil }
(this answer first posted on How to write conditional migrations in rails?)
Or even shorter
add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason