前提・実現したいこと
Ruby on Railsでオリジナルアプリを作成中の初学者です。
twitterのようなアプリで既にいいねしてある投稿を削除しようとしたらエラーが発生してそこから抜けられていません。
#開発環境
docker
Rails 6.1.1
ruby ruby 3.0.0
MySQL 8.0
発生している問題・エラーメッセージ
既にいいねしてある投稿を削除しようとしたら
ActiveRecord::InvalidForeignKey in PostsController#destroy Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (`workout_app_development`.`favorites`, CONSTRAINT `fk_rails_c3d75da8fd` FOREIGN KEY (`favorite_id`) REFERENCES `posts` (`id`))
というエラーが発生したので
post.rbの :favoriteに下記のように dependent: :destroyを加えました。
class Post < ApplicationRecord belongs_to :user has_many :favorites, dependent: :destroy has_many :comments has_many :tag_relationships, dependent: :destroy has_many :tags, through: :tag_relationships validates :content, presence: true, length: { maximum: 255 } validates :title, presence: true, length: { maximum: 30 } end
その後ブラウザを更新してみると下記のエラーになりました。
ActiveRecord::StatementInvalid in PostsController#destroy Mysql2::Error: Unknown column 'favorites.post_id' in 'where clause'
これは「無効な記述です。favorites.post_idカラムはありません。」というようなことを言われているのでしょうか?
favoritesテーブルにはuser_idとfavorite_idというカラムをしており、post_idカラムは作成しておりません。
schema.rb
create_table "comments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "content" t.bigint "user_id", null: false t.bigint "post_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["post_id"], name: "index_comments_on_post_id" t.index ["user_id"], name: "index_comments_on_user_id" end create_table "favorites", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "user_id", null: false t.bigint "favorite_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["favorite_id"], name: "index_favorites_on_favorite_id" t.index ["user_id", "favorite_id"], name: "index_favorites_on_user_id_and_favorite_id", unique: true t.index ["user_id"], name: "index_favorites_on_user_id" end create_table "posts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "content" t.bigint "user_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.string "title" t.string "youtube_url" t.text "note" t.string "target_muscle" t.index ["user_id"], name: "index_posts_on_user_id" end create_table "relationships", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "user_id", null: false t.bigint "follow_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["follow_id"], name: "index_relationships_on_follow_id" t.index ["user_id", "follow_id"], name: "index_relationships_on_user_id_and_follow_id", unique: true t.index ["user_id"], name: "index_relationships_on_user_id" end create_table "tag_relationships", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "post_id", null: false t.bigint "tag_id", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["post_id", "tag_id"], name: "index_tag_relationships_on_post_id_and_tag_id", unique: true t.index ["post_id"], name: "index_tag_relationships_on_post_id" t.index ["tag_id"], name: "index_tag_relationships_on_tag_id" end create_table "tags", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "tag_name" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end create_table "users", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name" t.string "email" t.string "password_digest" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end add_foreign_key "comments", "posts" add_foreign_key "comments", "users" add_foreign_key "favorites", "posts", column: "favorite_id" add_foreign_key "favorites", "users" add_foreign_key "posts", "users" add_foreign_key "relationships", "users" add_foreign_key "relationships", "users", column: "follow_id" add_foreign_key "tag_relationships", "posts" add_foreign_key "tag_relationships", "tags" end
favoritesテーブル作成時のマイグレーションファイル
class CreateFavorites < ActiveRecord::Migration[6.1] def change create_table :favorites do |t| t.references :user, null: false, foreign_key: true t.references :favorite, null: false, foreign_key: { to_table: :posts } t.timestamps t.index [:user_id, :favorite_id], unique: true end end end
マイグレーションファイルの{ to_table: :posts }という指定の仕方に問題があるのでしょうか?
どなたかご教授お願いいたします。