Help us understand the problem. What is going on with this article?

Rails5.1に移行後のmigrationファイルの注意

More than 3 years have passed since last update.

Rails5.1後に作成するmigrationファイルはデフォルトでidカラムにbigint型を使う(Mysqlの場合)
規模が大きいアプリケーションなら良いが、これによって不都合が出る人も割りといるのではないか。

そもそもintで十分なところをbigintにすると、1レコード辺りのデータ容量を余計に使ってしまう。

解決するには、create_tableメソッドのオプションでidの型を指定する。

create_table :cards_tags, id: :integer do |t|
# ...
end

bigintによって既存テーブルとの関係でエラーの原因になることも。以下で詳しく述べる。

referencesのエラー

例えば、既存テーブルを参照するmigrationファイルを生成して実行してみると、以下エラーになることがある。

以下のように既存のcardsとtagsを紐付ける中間テーブルを作成

cards_tagsの生成
class CreateCardsTags < ActiveRecord::Migration[5.1]
  def change
    create_table :cards_tags do |t|
      t.references :card, foreign_key: true
      t.references :tag, foreign_key: true

      t.timestamps
    end
  end
end

実行後、

Mysql2::Error: Table 'copylog_development.cards_tags' doesn't exist: SHOW FULL FIELDS FROM cards_tags

とでる。

referencesで作ろうとしているcard_id, tag_idはbigint型。
対して外部キーで参照したいcardsテーブルのidがinteger型なので、型が合わずエラーになるようだ。

解決策

mysql - Migration to create table raises Mysql2::Error: Table doesn't exist - Stack Overflow
こちらが参考になったが、migrationの[5.1]の指定を5.0に戻すか、次のようにreferencesを使用しない形式に変える。

cards_tagsの生成(5.1版)
class CreateCardsTags < ActiveRecord::Migration[5.1]
  def change
    create_table :cards_tags, id: :integer do |t|
      t.integer :card_id, foreign_key: true
      t.integer :tag_id, foreign_key: true

      t.timestamps
    end
  end
end
umeneri
都内にてScalaのサービス開発に従事しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away