スリ飯屋MaLankaのフリーエンジニアな日々

このブログでは、フリーランス5期目となる自身の実体験から、フリーランスエンジニアになるためのノウハウ、ブログや沖縄移住、スリランカの最新情報について発信します。

【Rails】論理削除を有効にする方法【paranoia discard】

※記事内に提携先企業のアフィリエイト広告(リンク、バナー等)、Google広告を含む場合があります


こんにちは、現役沖縄フリーランスエンジニアのmah(MaLanka)です。


このブログでは、

僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、

ノウハウなどを書いていきます。


今回は、


  • 【Rails】論理削除を有効にする方法【paranoia discard】


について書いていきます。




【Rails】論理削除を有効にする方法【paranoia discard】




論理削除とは


実際にはデータを削除せず、

削除されたというフラグを立て、

ユーザーには削除されたように見せること。


復元や参照が可能。




物理削除とは


データベースから削除すること。


復元したり参照は出来ない。




論理削除を有効にするための3ステップ


  • 1、paranoiaというgemをインストール


  • 2、モデルにdeleted_atというカラムを追加する


  • 3、active_record.rbにacts_as_paranoiaと追記する


class ApplicationRecord < ActiveRecord::Base
  acts_as_paranoia ←追記
  self.abstract_class = true
end




論理削除ができてるかを確認する流れ


  • rails cでサンプルオブジェクトを作ってから、DBに入る
rails dbconsole


  • projectsテーブルにオブジェクトがあることを確認(テーブルは複数形)
select * from projects;

 1 | bug1  | open   |            | 2019-02-14 01:47:51.525483 | 2019-02-14 02:59:10.62197
(1 row)


  • rails cでオブジェクト取得
Project.find(1)

Project Load (0.5ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."deleted_at" IS NULL AND "projects"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<Project id: 1, title: "bug1", status: "open", deleted_at: nil, created_at: "2019-02-14 01:47:51", updated_at: "2019-02-14 01:47:51">


  • オブジェクトを削除
Project.destroy(1)

 Project Load (0.6ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."deleted_at" IS NULL AND "projects"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
   (0.3ms)  BEGIN
  Project Update (0.5ms)  UPDATE "projects" SET "deleted_at" = $1, "updated_at" = $2 WHERE "projects"."id" = $3  [["deleted_at", "2019-02-14 02:54:25.740623"], ["updated_at", "2019-02-14 02:54:25.740812"], ["id", 1]]
   (6.0ms)  COMMIT
=> #<Project id: 1, title: "bug1", status: "open", deleted_at: "2019-02-14 02:54:25", created_at: "2019-02-14 01:47:51", updated_at: "2019-02-14 02:54:25">


  • 削除できていることを確認
irb(main):005:0> Project.find(1)
  Project Load (0.6ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."deleted_at" IS NULL AND "projects"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]


  • 論理削除なのでデータの取得は可能
irb(main):006:0> Project.with_deleted.find(1)
  Project Load (0.4ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<Project id: 1, title: "bug1", status: "open", deleted_at: "2019-02-14 03:16:37", created_at: "2019-02-14 01:47:51", updated_at: "2019-02-14 03:16:37">


  • 削除したオブジェクトを復元
irb(main):007:0> Project.with_deleted.find(1).restore
  Project Load (0.4ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
   (0.2ms)  BEGIN
  Project Update (0.3ms)  UPDATE "projects" SET "deleted_at" = $1, "updated_at" = $2 WHERE "projects"."id" = $3  [["deleted_at", nil], ["updated_at", "2019-02-14 03:16:57.013128"], ["id", 1]]
   (40.8ms)  COMMIT
=> #<Project id: 1, title: "bug1", status: "open", deleted_at: nil, created_at: "2019-02-14 01:47:51", updated_at: "2019-02-14 03:16:57">


  • 復元できていることを確認
irb(main):008:0> Project.find(1)
  Project Load (0.7ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."deleted_at" IS NULL AND "projects"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<Project id: 1, title: "bug1", status: "open", deleted_at: nil, created_at: "2019-02-14 01:47:51", updated_at: "2019-02-14 03:16:57">


以上です!




paranoia gem は非推奨


paranoiaのREAD.MEで、

paranoiaは非推奨になった旨が追記されています。

https://github.com/rubysherpas/paranoia


今後は下記の 「discard」 を使うようにしましょう。

https://github.com/jhawthorn/discard




RailsやRubyを学びたい人へ


RailsやRubyを学びたい人は、

RailsHack(レイルズハック)という、

最近できた新しいプログラミングスクール(今なら通常価格69,800円が、早期割で29,800円!)か、

Udemy で下記のコースを受講すると良いです★


✅1. フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座

✅2. 【はむ式】ハンズオンで学ぶRuby on Rails 6【Dockerにも触れられる】 <- おすすめ。ハムさんはReactやTypeScriptの教材も非常に丁寧。

✅3. はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう




また、

Udemy は定期的にセールをやっていますし(90%OFFとかもザラ)、

「30日間なら返金できる」ので、

満足できなかった時でも安心です。



【公式】RailsHack(レイルズハック)

【公式】Udemyで学んでみる




最後に


下記の表に、

フリーランスエンジニア向けの人気エージェントをまとめてみました。


エージェント選びで悩んでいる方は是非参考にしてみてくださいね★





あわせて読みたい


www.malanka.tech


www.malanka.tech


www.malanka.tech


www.malanka.tech