1
1

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.

【Rails】コメントされると投稿が削除できない!?

Last updated at Posted at 2020-05-25

投稿の経緯

Twitter、FbのようなSNSを作成中のことです。
投稿機能に削除ボタンを付けたのですが…投稿が消せない!!

もっと細かく言うと、ただの投稿は消せる。
投稿に写真を載せたり(postモデルとimageモデルで分けている場合に限る)
投稿にコメントをされたりすると消せなくなる。。

【本日の登場人物】
(親)postモデル →投稿を保存するモデル
(子)imageモデル →投稿に紐づく画像を保存するモデル
(子)commentモデル →投稿に対するコメントを保存するモデル

つまり、postモデルにネストしている**子モデル(imageモデル、commentモデル)**に値が入るとpostレコードを削除できなくなってしまう訳ですね。

実際のコードを見てみましょう。

実際のコード

post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_many :comments
  has_many :images
end

何の変哲もないpostモデルのアソシエーションですね。
ただ、このままだと、子モデルに値が入ると親モデルが消せなくなります。
なぜなら、親が消えてしまったら、子の親がいなくなってしまうから。。当たり前ですね笑

つまり、親を削除した時に、子も一緒に削除される設定をしてしまえばいいんです。

解決策

モデルで**「dependent: :destroy」**を設定してあげましょう。
dependent…翻訳すると「依存」ですね。イメージ湧きやすいかと思います。

これをアソシエーションの時に設定されたモデルは、そのクラスが削除されると、一緒に削除されるようになります。
何言ってるかわからないですね、実際に下に書いてみます。

解決後のコード

post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_many :comments,  dependent: :destroy
  has_many :images,    dependent: :destroy
end

何となくわかりましたかね?
Postクラスimageモデルcommentモデルに設定していますね。
postモデル(投稿)が削除されるとアソシエーションでdependent: :destroyを設定されたモデル(画像、コメント)も一緒に削除される訳ですね。

注意点

これに関して注意してもらいたいことがあります。
実はこのdependent: :destroyって子モデルを削除するための設定じゃないんです。

アソシエーションを削除するための設定なんです。

例えば、commentモデルに以下のとおり記載してみます。

comment.rb
belongs_to :post, dependent: :destroy

こうなってしまうと、コメントを削除したら投稿まで削除されてしまいます。

もう一度いいます。
アソシエーションの時に設定されたモデルは、そのクラスが削除されると、一緒に削除されるようになります。

まとめ

今回も私の拙い説明を最後まで読んでいただきありがとうございました。
間違いや補足がありましたらコメントいただけると嬉しいです。

どんどはれ。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?