外部キーが原因でマイグレーションをロールバックできません。
ツイートに対してコメントできる機能をつけています
モデル
Tweets
has_many :comments,dependent: :destroy
Comments
belongs_to :tweet
マイグレーション
Comments
t.references :tweet, foreign_key: true,null: false
ロールバック時にエラーが発生します
外部キーが原因で削除できないようなことだと思いますが、dependent: :destroyをしているのに何故なのでしょうか?
ActiveRecord::StatementInvalid: Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails: DROP TABLE `tweets` Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails
追記
ロールバックしようとしているマイグレーション
class CreateTweets < ActiveRecord::Migration[5.2] def change create_table :tweets do |t| t.string :title_info t.string :round t.text :text t.text :image t.integer :school_a_score t.integer :school_b_score t.timestamps null: true t.references :school_a, foreign_key: { to_table: :categories }, null: false t.references :school_b, foreign_key: { to_table: :categories }, null: false t.references :tournament, foreign_key: { to_table: :categories }, null: false end end end
コメントのマイグレーション
class CreateComments < ActiveRecord::Migration[5.2] def change create_table :comments do |t| t.references :user, foreign_key: true,null: false t.references :tweet, foreign_key: true,null: false t.text :text,null: false t.timestamps end end end
####経緯
commetnsテーブルとtweetsテーブルを作成済みの後の話です
commentsテーブルに外部キー制約をつけ忘れたのでcommentsのマイグレーションをロールバックし変更しました
変更前 t.integer :tweet_id 変更後 t.references :tweet, foreign_key: true,null: false
その後tweetsのマイグレーションファイルもロールバックしたくて実行したのですが、エラーが発生しました
ロールバックしようとしているマイグレーションの中身はどのようなものでしょうか?
追記しました
コメントに関する記述はしていません
> コメントに関する記述はしていません
commentsテーブルはどのように作ったのでしょうか?
すみません、Tweetのマイグレーションファイルにコメントに関する記述はしていないという意味です
commentsテーブルは
rails g controller comments
のコマンドをうちこみ
そしてrails db:migrateで作成しました
えっと、「コメントのテーブル作成をロールバックせずにツイートだけロールバックする」状態になってしまっているようですが、どんな状況でしょうか?
追記しました
「commentsのマイグレーションをロールバック」しているなら、commentsのテーブルは「存在しない」のが正しいです。なぜ存在する状況になっているのでしょうか?
(commentsはあるけれどtweetsだけロールバックされた状態、にすることはできません)
なるほど、コメントマイグレーションをロールバックしてから、ツイートマイグレーションをロールバックできました
ベストアンサーにしたいので回答をお願いします
回答1件
あなたの回答
tips
プレビュー