#バージョン情報
- Ruby: 2.5.0
- Rails: 5.1.6
- Postgres: 11.1
- macOS: 10.14.1
#事象
usersテーブルのgenderカラムをstringからintegerに変えるため、以下のコマンドでマイグレーションファイルを作成し、
bin/rails g migration change_gender_datatype_to_integer_in_users
作成されたマイグレーションファイルに以下のように記載した後、
class ChangeGendersDatatypeInUsers < ActiveRecord::Migration[5.1]
def change
change_column :users, :gender, :integer
end
end
マイグレーションを実行すると、
bin/rails db:migrate
以下のエラーが表示されました。
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::DatatypeMismatch: ERROR: default for column "gender" cannot be cast automatically to type integer
ググってみると、同様のエラーに遭遇している先人たちがおりましたので参考にしましたが、いずれの方法でも回避することはできず。。。
https://qiita.com/gam0022/items/a73910de5b8eb44e5b13
https://stackoverflow.com/questions/12603498/rails-migration-error-w-postgres-when-pushing-to-heroku
https://dzone.com/articles/rails-5-change-database-column
#解決方法
一度該当カラムをremoveして、再度追加することで対応しました。
一度ドロップして、
remove_column :users, :gender
ドロップできたら新しいマイグレーションファイルを作成して、add_columnしてあげます。
add_column :users, :gender, :integer, after: :phone, default: 0
すると追加できました!が、なぜかafterが機能しておらず、末尾に追加されてしまいました。
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "gender", default: 0
解決したら更新します。