Help us understand the problem. What is going on with this article?

退会時に投稿データを削除する [Rails]

初めに

ポートフォリオを作成中、退会ユーザのデータの処理に困った結果、退会時に投稿データを削除することにしました。
※今回は論理削除を導入している為、論理削除が度々出てくると思いますが論理削除を導入していない場合でも、大丈夫です。

開発環境

・ruby-2.5.5
・Rails 5.2.3

gem
・devise
・paranoia(論理削除用)

前提条件

・deviseを使用したユーザ登録する。
・ユーザが退会すると削除フラグを設置し、論理削除扱いにする。
論理削除をついてはこちらをご覧ください。

現状

LINEの様なポートフォリオを作成中です。
ユーザが退会するとユーザ情報を論理削除されます。
しかし、退会ユーザの投稿はDB内に存在しているので、ある条件下(退会ユーザがコメントしたチャットルームに入る)ではエラーが発生します。

改善策

退会時に、ユーザの投稿を削除することにしました。

改善

コントローラー

コントローラーに退会機能を記述します。
初心者でも見たことある記述だと思います。

users_controller.rb
  def destroy
    user = User.find(params[:id]) #ユーザ毎の情報を得る
    user.destroy #ユーザ情報を削除(退会)
    redirect_to home_path #削除後、homeに移動させる
  end

モデル

userモデルとmessageモデルは1対多になっています。

message.rb

optional: trueは外部キーにnilを許可するものです。
ruby:message.rb
belongs_to :user, optional: true

user.rb

ここが重要です。
dependent => :destroyを記述することで、退会時にユーザID情報(user_idを持つもの)を持つデータを削除します。

user.rb
has_many :messages, :dependent => :destroy#退会時コメントも削除

最後に

たったこれだけで、退会時にデータを同時に削除できます。
もしよかったら参考にしてみてください。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away