下記のようなマイグレーションファイルを作成しました。
実行したらどうなるでしょうか?
環境:Rails 5.2.3, mysql 8.0.16
db/migrate/20190731062120_hoge.rb
class Hoge < ActiveRecord::Migration[5.2]
def change
create_table :hoges do |t|
# nameが重複しているぞ!!!
t.string :name
t.string :name
end
end
end
あれ、成功した?!
# bundle exec rake db:migrate
== 20190731062120 Hoge: migrating =============================================
-- create_table(:hoges)
-> 0.0471s
== 20190731062120 Hoge: migrated (0.0512s) ====================================
SQLを見ると重複カラムが除かれているみたいです。
意図して除いているのかhashのkeyみたいになっていて意図せず上書きされちゃっているのかコードを見ていないのでわかりませんが正常に動作します。
log/development.log
CREATE TABLE `hoges` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar(255))
で、同様のコードをrails6でマイグレーションしてみましょう。
環境:Rails 6.0.0.rc1, mysql 8.0.16
db/migrate/20190731053302_hoge.rb
class Hoge < ActiveRecord::Migration[6.0]
def change
create_table :hoges do |t|
t.string :name
t.string :name
end
end
end
お、エラーになった。
rails6からは重複しているカラムを除いてくれなくなったみたいです。
# bundle exec rake db:migrate
== 20190731053302 Hoge: migrating =============================================
-- create_table(:hoges)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
you can't define an already defined column 'name'.
1テーブルに同じ名前のカラムを書くことはないのでバグですが、正常終了してしまうため気づかずに潜んでいる可能性があります。
Rails6にバージョンアップしたらrake db:migrate
で1からデータベースを作成しなおしてみたほうがよさそうです。