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

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

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




今すぐ登録したい方へ


このブログから登録の多いエージェントは下記の3つです★

(リンクをクリックすると公式サイトに飛びます)

【ダントツの1位】フォスターフリーランス【案件保有数5000件以上。業界20年の超老舗】

【僅差で2位】エミリーエンジニア【4人に1人が初めてのフリーランス】

【惜しくも3位】Midworks(ミッドワークス) 【リモート案件が超豊富。正社員並みの保障アリ】




こんにちは、mah(@RailsRubyMah6h)です。


このブログでは、

僕が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




最後に


下記の表に、

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


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





あわせて読みたい


www.malanka.tech


www.malanka.tech


www.malanka.tech


www.malanka.tech




最後までお読み頂きありがとうございました★

もしよかったらTwiiterのフォローもお願いします★