質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

受付中

rails db:migrateができません、どうか助けてください

koukinagano
koukinagano

総合スコア1

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

2回答

1グッド

1クリップ

2896閲覧

投稿2021/04/09 08:28

編集2021/04/09 08:29

###現象
オリジナルアプリ製作中に起こった現象です。
部分テンプレートのヘッダーにログインボタンや新規登録ボタンがあるのですが、急に新規登録ボタンのnew_user_registration_pathのルーティングがなくなっていました。
なので調べたところあまり同じ現象になったことがある人は少なく参考にする記事がないので、もう一度deviseを入れ直したりしたら治るのではと思いrails g devise user などを行っていました。
それでも治らず、、、
そこで、一度テーブルを消してから(マイグレーションファイルがあるためやり直せると思った)もう一度rails db:migrateをすればやり直せるのではと思ったので全テーブルを削除して再度rails db:migrateをおこないました。
そうしたら途中までしかテーブルが作られずターミナルでのエラーとgoogleのタブでのエラーが出てきました。

###エラー文
ターミナル

== 20201208032056 CreateItems: migrating ====================================== -- create_table(:items) rails aborted! StandardError: An error has occurred, all later migrations canceled: Column `user_id` on table `items` does not match column `id` on `users`, which has type `bigint(20)`. To resolve this issue, change the type of the `user_id` column on `items` to be :bigint. (For example `t.bigint :user_id`). Original message: Mysql2::Error: Cannot add foreign key constraint /Users/naganokouki/projects/Old_fashion/db/migrate/20201208032056_create_items.rb:3:in `change' /Users/naganokouki/projects/Old_fashion/bin/rails:9:in `<top (required)>' /Users/naganokouki/projects/Old_fashion/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Caused by: ActiveRecord::MismatchedForeignKey: Column `user_id` on table `items` does not match column `id` on `users`, which has type `bigint(20)`. To resolve this issue, change the type of the `user_id` column on `items` to be :bigint. (For example `t.bigint :user_id`). Original message: Mysql2::Error: Cannot add foreign key constraint /Users/naganokouki/projects/Old_fashion/db/migrate/20201208032056_create_items.rb:3:in `change' /Users/naganokouki/projects/Old_fashion/bin/rails:9:in `<top (required)>' /Users/naganokouki/projects/Old_fashion/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Caused by: Mysql2::Error: Cannot add foreign key constraint /Users/naganokouki/projects/Old_fashion/db/migrate/20201208032056_create_items.rb:3:in `change' /Users/naganokouki/projects/Old_fashion/bin/rails:9:in `<top (required)>' /Users/naganokouki/projects/Old_fashion/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace)

googleタブのエラー

ActiveRecord::PendingMigrationError Migrations are pending. To resolve this issue, run: rails db:migrate RAILS_ENV=development

###行ったこと
ターミナルのエラーにColumn user_id on table items does not match column id on users, which has type bigint(20). To resolve this issue, change the type of the user_id column on items to be :bigint. (For example t.bigint :user_id).というのがあるがこの場合reference型で現象が起こるまでは表示できていたので問題なさそうなので特に何もしていません。

googleタブのエラーの方はエラー画面にある”Run pending migrations”のグレーのボタンを押す
エラー文の指示通りに”rails db:migrate RAILS_ENV=development”を実行とあったので押してみたが、
An error has occurred, all later migrations canceled: Column user_id on table items does not match column id on users, which has type bigint(20). To resolve this issue, change the type of the user_id column on items to be :bigint. (For example t.bigint :user_id). Original message: Mysql2::Error: Cannot add foreign key constraint
とターミナルのエラーと一緒。マイグレーションファイルの読み込み順がおかしいのではと思いusersテーブルとitemsテーブルの読み込みを日付を変えてもう一度読み込ませたが同じエラーが出ます。

エラーの解決策を教えていただきたいです。
長くてわかりにくいとおもいますが、ご協力お願いします。

shinoharat👍を押しています

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

書き方がごっちゃになってる気がします

Railsの外部キー制約とreference型について

この記事に重要なヒントがありますね。

reference型を使わない場合、foreign_key: trueでは外部キー制約にならないので注意が必要です。

レファレンス型だと

t.references :参照元テーブル, foreign key:true

で行けるみたいです。

でもbigint(20)のように任意の型指定だと後で付け足す必要があるようです。

t.bigint(20) :user end add_foreign_key :user,:item

それを無理に
t.bigint(20) :user, foreign_key: true
記法を合体してしまっているので、こんな文法ないですよ、:ってなんですかというエラーを吐くようになっています(workshajikoma氏の回答内会話冒頭部分)

投稿2021/04/23 16:26

FKM

総合スコア3416

shinoharat👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

shinoharat

2021/04/24 00:28

FKMさんの回答に補足です。 t.bigint(20) :user だと SyntaxError になりますので、 t.bigint :user, limit: 20 と書く必要があります。

0

エラーメッセージに書いてあるとおりですが、itemsテーブルのuser_idとusersテーブルのidのデータ型が異なるため、外部キー制約が設定できずエラーになっていますので、user_idのデータ型をbigint(20)にするようマイグレーションファイルを変更してください。

投稿2021/04/09 08:44

編集2021/04/09 08:45
workshajikoma

総合スコア110

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

koukinagano

2021/04/10 02:05 編集

マイグレーションファイルの記述を変えましたらこのようなエラーが出ました naganokouki@naganokoukinoMacBook-Air Old_fashion % rails db:migrate rails aborted! SyntaxError: /Users/naganokouki/projects/Old_fashion/db/migrate/20201208032056_create_items.rb:8: syntax error, unexpected ':', expecting end t.bigint(20) :user, foreign_key: true ^ /Users/naganokouki/projects/Old_fashion/db/migrate/20201208032056_create_items.rb:14: syntax error, unexpected end, expecting end-of-input /Users/naganokouki/projects/Old_fashion/bin/rails:9:in `<top (required)>' /Users/naganokouki/projects/Old_fashion/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace) (20)を消してみましたがまた違ったエラーが出ます。 ここから何か解決策はありますか?
workshajikoma

2021/04/10 05:38

> t.bigint(20) :user, foreign_key: true これは恐らくt.references :user, foreign_key: trueだったものを書き換えたのだと思われますが、記法が違います。ただ元々はreferencesで動いていたとのことなので、原因はRailsやMigrationのバージョンかもしれません。 参考:https://qiita.com/aseanchild1400/items/87b89b55d596f6465fd6 ・Railsのバージョン ・usersテーブルをCreateするmigrationファイルの掲載 ・itemsテーブルをCreateするmigrationファイルの掲載 このあたり情報があればわかるかもしれません。
koukinagano

2021/04/13 14:51

返信遅くなってしまい申し訳ありません RailsのバージョンはRails 6.0.3.4です。 usersテーブルマイグレーションファイル ``` # frozen_string_literal: true class DeviseCreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable # t.integer :sign_in_count, default: 0, null: false # t.datetime :current_sign_in_at # t.datetime :last_sign_in_at # t.string :current_sign_in_ip # t.string :last_sign_in_ip ## Confirmable # t.string :confirmation_token # t.datetime :confirmed_at # t.datetime :confirmation_sent_at # t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at t.timestamps null: false end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end end ``` itemsテーブルマイグレーションファイル ``` class CreateItems < ActiveRecord::Migration[6.0] def change create_table :items do |t| t.string :title, null:false t.text :information t.integer :category_id, null:false t.string :brand t.bigint(20) :user, foreign_key: true t.references :profile, foreign_key: true t.timestamps end end end ``` これがファイルです、何かわかることがありましたらよろしくお願いします。
FKM

2021/04/23 16:33 編集

どのテーブルのどれを参照すりゃいいんじゃい!と怒ってます。 文法が間違っている上に、その文法だと参照先テーブルの指定がありません。 回答に詳述

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。