4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

dependent: :destroy 削除が出来ない

Posted at

##今回のテーマは、destroyメソッドが機能しない。
という事で、今回陥った点からまずお話致します。

トークルームにてチャットが出来るアプリにて、マイページでトークルームを削除できない。
という問題点でかなり悩まされる事に。

##テーブル

memo_roomsに関連付けられているのは、
usersテーブル  
memo_room_postsテーブル
categoriesテーブル
favoritesテーブル
memo_room_commentsテーブルの5つです。

##解決前までの流れ。

最初にルームが削除出来ないと気付いた時には

    @memo_room.destroy
      flash[:success] = 'メモルームを削除しました。'
      redirect_to user_path(current_user)
  end```

コントローラにてこんな感じで書いていました。これにより、失敗しても成功しても削除しました。としか出ず、成功はしてるが、
何故か削除出来ていない。こう勘違いしました。どうしても解けず、質問掲示板にて質問をしました。

```def destroy
    if @memo_room.destroy
      flash[:success] = 'メモルームを削除しました。'
    else
      flash[:danger] = '削除に失敗しました。'
      redirect_to user_path(current_user)
    end
  end```

すると・・・成否がどちらでも削除しました。となっているので失敗してるかわからないと、このようにアドバイスを頂き、
アドバイス通りにelseを追加したところ、削除に失敗しました。と表示されました。

成功してると思っていたが、実は失敗していたんですね。それに気づかず成功してる前提で何故消えないかを探していたので
見つかる訳がありません。

##rbファイル dependent: :destroy  間違い編

class MemoRoom < ApplicationRecord
belongs_to :user
belongs_to :category, dependent: :destroy

has_many :memo_room_posts, dependent: :destroy
has_many :favorites, dependent: :destroy
has_many :memo_room_comments, dependent: :destroy

class MemoRoomPost < ApplicationRecord
belongs_to :user
belongs_to :memo_room, dependent: :destroy

has_many :memo_room_posts, dependent: :destroy
has_many :memo_rooms, dependent: :destroy
has_many :categories, dependent: :destroy
has_many :favorites, dependent: :destroy


dependent: :destroyをとりあえず付けておけば削除した際に関連されたデータも消えるから便利程度の認識でした。
ここがまず間違いでこれのせいで、関連付けが多すぎて網目のようになり、ぐちゃぐちゃになってがんじがらめになっていると教えて頂きました。


そして、アドバイスとして一番わかりやすかったのが、

**こいつを消したら意味が無くなるもの に対してのみその方向でのdependent: :destroyをつけるようにしてください**

この時、初めて使い方をきちんと知りました。とてもわかりやすい一言でした。

##解決編

class MemoRoom < ApplicationRecord
belongs_to :user
belongs_to :category

has_many :memo_room_posts, dependent: :destroy
has_many :favorites, dependent: :destroy
has_many :memo_room_comments, dependent: :destroy


memo_roomを消す事により、トークルーム内の投稿であるmemo_room_postsとmemo_roomにいいねされたfavoritesそしてトークルームが消えればコメントも無意味になるのでmemo_room_commentsこの3つのみにdependent: :destroyを付けてみました。

すると、がんじがらめから抜けて綺麗になったのか、削除する事が出来ました。必要のない項目にdependentがダメ!なんて初心者は知らない人もいると思うので、役に立つメモとなればと思います。
知ったかぶり ←しっかりと知識をつけることの大切さを知りました。

https://teratail.com/questions/240800

実際に質問した際のURL。も載せておきます。

以上上手く削除が出来なくなってしまった際のメモでした。参考になればと思います。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?