1. ホーム
  2. ruby-on-rails

[解決済み] Railsのマイグレーション。存在確認と継続?

2023-05-06 03:44:39

質問

マイグレーションでこのようなことをやっていました。

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

が、判明しました。 これは SQLite では動作しますが、PostgreSQL では動作しません。 . add_columnが吹っ飛べばいいみたいなんだけど。 例外が捕捉されても をキャッチしたとしても、トランザクションは停止しているので、マイグレーションは追加の作業をすることができません。

何か DB に特化しない カラムやテーブルがすでに存在するかどうかを確認する方法はありますか?それに失敗した場合、私の救助ブロックを本当に動作させる方法はあるのでしょうか?

どのように解決するのですか?

Rails 3.0以降のバージョンでは、Rails上で column_exists? を使ってカラムが存在するかどうかをチェックすることができます。

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

また table_exists? という関数もあり、これはRails 2.1にまでさかのぼります。