Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

削除の際に外部キー制約が邪魔をして削除できない

解決したいこと

プログラミング学習を始めて1ヶ月の初学者です。
現在railsを使いオリジナルアプリを作成しています。
タスクを登録し、学習時間などを記録しツイートできる機能を作ろうとしています。

タスクを削除しようとするとエラーが発生し、削除が失敗してしまいます。

発生している問題・エラー

Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (`futures_development`.`study_records`, CONSTRAINT `fk_rails_64ef43758c` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`))

https://gyazo.com/9ab42cfc70a7061a2a81cd28968e217f

該当するソースコード

def destroy
    if @category.destroy
      redirect_to controller: :tweets, action: :index
    else
      render template: 'tweets/index'
    end
  end

モデル間のアソシエーション
app/models/category.rb

class Category < ApplicationRecord
  # アソシエーション
  belongs_to :user
  has_many :tweets
  has_one :study_record, dependent: :destroy
  # バリデーション
  validates :task, presence: true
end

app/models/study_record.rb

class StudyRecord < ApplicationRecord
  belongs_to :category
end

categoryテーブルのマイグレーションファイル

class CreateCategories < ActiveRecord::Migration[6.0]
  def change
    create_table :categories do |t|
      t.string      :task, null: false
      t.references :user, null: false, forign_key: true
      t.timestamps
    end
  end
end

study_recordのマイグレーションファイル

class CreateStudyRecords < ActiveRecord::Migration[6.0]
  def change
    create_table :study_records do |t|
      t.float       :hour_time, null: false
      t.references  :category, null: false, foreign_key: true
      t.timestamps
    end
  end
end

自分で試したこと

dependent: :destroyをcategory.rbに追加してみたのですが変化無しでした💦

恐らくcategoryテーブルのtaskカラムを削除すると外部キーを受け取っているstudy_recordテーブルと辻褄が合わなくなってエラーが出ているのだと思うのですが、、、
かなり初歩的な質問かと思いますが、原因を教えて頂けると嬉しいです!

0

1Answer

migrationファイルにも外部キーを設定していますが、なくても大丈夫です。
mysqlのエラーなのでDBの設定から外部キーを外したら消せると思いますよ。

かなり厳密な設計をするわけでないのであればrailsの外部キー設定だけでもOKだと思うので、DBの設定は外して、どうしても必要であればMySQL側でも設定する。で良いと思います。

2Like

Comments

  1. 回答ありがとうございます!

    study_recordのマイグレーションファイルの外部キー設定
    t.references :category, null: false, foreign_key: true
    こちらを消しても良いということでしょうか??
    それともDB側で特別な設定をしないといけないのでしょうか?

    質問ばかりですみません。
    ご教授のほどよろしくお願いします。
  2. `foreign_key: true`

    という箇所で外部キー制約をMySQL側で設定しているので
    ```
    t.references :category, null: false, foreign_key: true
    ```

    下記のように消す&rails db:migrateを実行することで外部制約は外れるはずです

    ```
    t.references :category, null: false
    ```
  3. 無事登録する事ができました!!
    大変わかりやすく丁寧に本当にありがとうございました!
    また、機会があればよろしくおねがいします。
  4. よかったです!!
    もちろんです!頑張ってください!

Your answer might help someone💌