mind.

学んだことの記録

Rails + PostgreSQLでカラムをキャストできない型に変更する方法

トラブル時の状況

  • bit_varying型のカラムをinteger型に変更したかったがCAST()で雑にキャストできなかった
  • 一旦string型に変更してからinteger型に変更しようとするマイグレーションを実行したが、string型で処理されてしまった

解決方法

カラムを削除する変更と追加する変更を行う
マイグレーションファイル

class ChangeUserHogehogeToInteger < ActiveRecord::Migration[5.2]
  def change
    remove_column :user, :hogehoge
    add_column :user, :hogehoge, :integer, null: false, comment: "hoge"
  end
end

カラムの変更後に必要な作業

  • モデルテストの修正
  • モデルのバリデーション修正

おまけ

  • integerに変更後、負数を許さない場合はモデルでバリデーションチェックを行う
  validates :hogehoge, presence: true, numericality: { greater_than_or_equal_to: 0 }

参考

qiita.com

この記事はkb Advent Calendar 2020 3日目の記事です。

adventar.org